深入理解jQuery()方法的構(gòu)建原理
前言
雖然JQuery相對(duì)簡(jiǎn)單,但要全面掌握,且快速靈活的使用它也并不那么容易,它提供了很多方法,包含了網(wǎng)頁(yè)開(kāi)發(fā)的各個(gè)知識(shí)面,所以要全面掌握這些知識(shí)點(diǎn),個(gè)人認(rèn)為還是需要對(duì)jquery有深入的理解,對(duì)這些知識(shí)點(diǎn)做分類整理記憶,這樣你才能面對(duì)一些JQuery代碼的時(shí)候不會(huì)感到迷惑,才會(huì)知道采用何種方式實(shí)現(xiàn)某個(gè)特效是最佳實(shí)踐,才能快速的采用JQuery來(lái)進(jìn)行項(xiàng)目開(kāi)發(fā)。
jQuery中最常用方法的就是jQuery( ) ,也即$( ) 。
jQuery( )是一個(gè)函數(shù)調(diào)用,調(diào)用的結(jié)果是返回了一個(gè)jQuery實(shí)例對(duì)象。
編寫(xiě)組件通常的做法是將組件封裝成一個(gè)對(duì)象,需要用的時(shí)候則通過(guò)new運(yùn)算符來(lái)創(chuàng)建一個(gè)實(shí)例。但是jQuery( )無(wú)須我們用new手工實(shí)例化,它會(huì)自動(dòng)返回一個(gè)實(shí)例。
要實(shí)現(xiàn)這一點(diǎn),最直接的思路就是定義這樣一個(gè)函數(shù):

這么做的問(wèn)題是出現(xiàn)了死循環(huán):

最簡(jiǎn)單的解決辦法是借助另一個(gè)構(gòu)造函數(shù):

這么做技術(shù)上并沒(méi)有什么問(wèn)題,但是jQuery的作者并沒(méi)有這么做,可能是出于某種技術(shù)潔癖或者我暫時(shí)不清楚的原因,init被定義在了jQuery函數(shù)的原型中:

通過(guò)init作為中轉(zhuǎn)站,最終return出了一個(gè)jQuery實(shí)例。看上去更“雅致”,更有“技術(shù)范”。
將上述代碼寫(xiě)在一個(gè)自執(zhí)行函數(shù)內(nèi)(形成私有作用域,避免命名空間污染),就構(gòu)成了jQuery的核心框架(簡(jiǎn)化版):

要理解上述結(jié)構(gòu)的工作原理,必須理解JavaScript基于構(gòu)造函數(shù)和原型的繼承模式。
當(dāng)函數(shù)調(diào)用表達(dá)式前出現(xiàn)了關(guān)鍵字new,這個(gè)函數(shù)就成了構(gòu)造函數(shù),此時(shí)會(huì)依次發(fā)生四件事:
1、首先一個(gè)空對(duì)象(又稱實(shí)例)被創(chuàng)建出來(lái)了。
2、該空對(duì)象繼承構(gòu)造函數(shù)的原型中的屬性和方法。這也是為什么要把方法都寫(xiě)在構(gòu)造函數(shù)的prototype里。
3、該空對(duì)象被賦值給構(gòu)造函數(shù)內(nèi)部的this對(duì)象。
4、執(zhí)行構(gòu)造函數(shù)。如果構(gòu)造函數(shù)中顯式的返回了一個(gè)對(duì)象,那么new出的就不再是新創(chuàng)建的空對(duì)象,而是return指定的對(duì)象。否則一律返回新建空對(duì)象。
具體參見(jiàn)阮一峰教程:http://javascript.ruanyifeng.com/oop/basic.html
于是jQuery( )的構(gòu)造原理就很清晰了:每次調(diào)用jQuery( )都返回由構(gòu)造函數(shù)init指定返回的this對(duì)象,而this對(duì)象已經(jīng)被賦值為那個(gè)新創(chuàng)建的空對(duì)象。由于把jQuery.prototype都賦給了init.prototype,所以新創(chuàng)建的空對(duì)象繼承所有jQuery的方法。
構(gòu)造函數(shù)init里面的return this其實(shí)刪掉也無(wú)妨,至于作者為啥要加這句,呃,可能是因?yàn)橹赖奶唷?/p>
總結(jié)
以上就是jQuery()方法構(gòu)建原理的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
- JavaScript/jQuery、HTML、CSS 構(gòu)建 Web IM 遠(yuǎn)程及時(shí)聊天通信程序
- jQuery的初始化與對(duì)象構(gòu)建之淺析
- 使用jQuery.wechat構(gòu)建微信WEB應(yīng)用
- jQuery學(xué)習(xí)筆記之jQuery構(gòu)建函數(shù)的7種方法
- Jquery 快速構(gòu)建可拖曳的購(gòu)物車(chē)DragDrop
- 精選的10款用于構(gòu)建良好易用性網(wǎng)站的jQuery插件
- 讀jQuery之三(構(gòu)建選擇器)
- JQuery 構(gòu)建客戶/服務(wù)分離的鏈接模型中Table分頁(yè)代碼效率初探
- JQuery 構(gòu)建客戶/服務(wù)分離的鏈接模型中Table中的排序分析
- 實(shí)例詳解jQuery的無(wú)new構(gòu)建
相關(guān)文章
JavaScript中改變this指向的三種方式總結(jié)
this?指向的值是可以通過(guò)手動(dòng)方式去改變的,比如call、bind、apply方法,本文主要為大家介紹了這三種方式的具體實(shí)現(xiàn)步驟,需要的可以參考下2023-12-12
當(dāng)滾動(dòng)條滾動(dòng)到頁(yè)面底部自動(dòng)加載增加內(nèi)容的js代碼
這篇文章主要介紹了如何使用javscript實(shí)現(xiàn)滾動(dòng)條滾動(dòng)到頁(yè)面底部自動(dòng)加載增加頁(yè)面內(nèi)容,需要的朋友可以參考下2014-05-05
TS報(bào)錯(cuò):Parameter?'xxx'?implicitly?has?an?'
這篇文章主要給大家介紹了關(guān)于TS報(bào)錯(cuò):Parameter?'xxx'?implicitly?has?an?'any'?type的解決方式,文中將產(chǎn)生錯(cuò)誤的原因及解決方法都介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
JS與JQuery分別實(shí)現(xiàn)淘寶五星好評(píng)特效
這篇文章主要為大家詳細(xì)介紹了JS與JQuery分別實(shí)現(xiàn)淘寶五星好評(píng)特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
讓IDE識(shí)別webpack的別名alias的實(shí)現(xiàn)方法
這篇文章主要介紹了讓IDE識(shí)別webpack的別名alias的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
ES6?class類實(shí)現(xiàn)繼承實(shí)例詳解
傳統(tǒng)的javascript中只有對(duì)象,沒(méi)有類的概念,下面這篇文章主要給大家介紹了關(guān)于ES6?class類實(shí)現(xiàn)繼承的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10

