深入理解jQuery()方法的構(gòu)建原理
前言
雖然JQuery相對簡單,但要全面掌握,且快速靈活的使用它也并不那么容易,它提供了很多方法,包含了網(wǎng)頁開發(fā)的各個知識面,所以要全面掌握這些知識點(diǎn),個人認(rèn)為還是需要對jquery有深入的理解,對這些知識點(diǎn)做分類整理記憶,這樣你才能面對一些JQuery代碼的時候不會感到迷惑,才會知道采用何種方式實(shí)現(xiàn)某個特效是最佳實(shí)踐,才能快速的采用JQuery來進(jìn)行項(xiàng)目開發(fā)。
jQuery中最常用方法的就是jQuery( )
,也即$( )
。
jQuery( )
是一個函數(shù)調(diào)用,調(diào)用的結(jié)果是返回了一個jQuery實(shí)例對象。
編寫組件通常的做法是將組件封裝成一個對象,需要用的時候則通過new運(yùn)算符來創(chuàng)建一個實(shí)例。但是jQuery( )
無須我們用new手工實(shí)例化,它會自動返回一個實(shí)例。
要實(shí)現(xiàn)這一點(diǎn),最直接的思路就是定義這樣一個函數(shù):
這么做的問題是出現(xiàn)了死循環(huán):
最簡單的解決辦法是借助另一個構(gòu)造函數(shù):
這么做技術(shù)上并沒有什么問題,但是jQuery的作者并沒有這么做,可能是出于某種技術(shù)潔癖或者我暫時不清楚的原因,init
被定義在了jQuery函數(shù)的原型中:
通過init作為中轉(zhuǎn)站,最終return
出了一個jQuery實(shí)例。看上去更“雅致”,更有“技術(shù)范”。
將上述代碼寫在一個自執(zhí)行函數(shù)內(nèi)(形成私有作用域,避免命名空間污染),就構(gòu)成了jQuery的核心框架(簡化版):
要理解上述結(jié)構(gòu)的工作原理,必須理解JavaScript基于構(gòu)造函數(shù)和原型的繼承模式。
當(dāng)函數(shù)調(diào)用表達(dá)式前出現(xiàn)了關(guān)鍵字new,這個函數(shù)就成了構(gòu)造函數(shù),此時會依次發(fā)生四件事:
1、首先一個空對象(又稱實(shí)例)被創(chuàng)建出來了。
2、該空對象繼承構(gòu)造函數(shù)的原型中的屬性和方法。這也是為什么要把方法都寫在構(gòu)造函數(shù)的prototype
里。
3、該空對象被賦值給構(gòu)造函數(shù)內(nèi)部的this
對象。
4、執(zhí)行構(gòu)造函數(shù)。如果構(gòu)造函數(shù)中顯式的返回了一個對象,那么new
出的就不再是新創(chuàng)建的空對象,而是return
指定的對象。否則一律返回新建空對象。
具體參見阮一峰教程:http://javascript.ruanyifeng.com/oop/basic.html
于是jQuery( )
的構(gòu)造原理就很清晰了:每次調(diào)用jQuery( )
都返回由構(gòu)造函數(shù)init
指定返回的this
對象,而this
對象已經(jīng)被賦值為那個新創(chuàng)建的空對象。由于把jQuery.prototype
都賦給了init.prototype
,所以新創(chuàng)建的空對象繼承所有jQuery的方法。
構(gòu)造函數(shù)init
里面的return this
其實(shí)刪掉也無妨,至于作者為啥要加這句,呃,可能是因?yàn)橹赖奶唷?/p>
總結(jié)
以上就是jQuery()方法構(gòu)建原理的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
- JavaScript/jQuery、HTML、CSS 構(gòu)建 Web IM 遠(yuǎn)程及時聊天通信程序
- jQuery的初始化與對象構(gòu)建之淺析
- 使用jQuery.wechat構(gòu)建微信WEB應(yīng)用
- jQuery學(xué)習(xí)筆記之jQuery構(gòu)建函數(shù)的7種方法
- Jquery 快速構(gòu)建可拖曳的購物車DragDrop
- 精選的10款用于構(gòu)建良好易用性網(wǎng)站的jQuery插件
- 讀jQuery之三(構(gòu)建選擇器)
- JQuery 構(gòu)建客戶/服務(wù)分離的鏈接模型中Table分頁代碼效率初探
- JQuery 構(gòu)建客戶/服務(wù)分離的鏈接模型中Table中的排序分析
- 實(shí)例詳解jQuery的無new構(gòu)建
相關(guān)文章
關(guān)于js二維數(shù)組和多維數(shù)組的定義聲明(詳解)
下面小編就為大家?guī)硪黄P(guān)于js二維數(shù)組和多維數(shù)組的定義聲明(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10Easyui Tree獲取當(dāng)前選擇節(jié)點(diǎn)的所有頂級父節(jié)點(diǎn)
這篇文章主要介紹了Easyui Tree獲取當(dāng)前選擇節(jié)點(diǎn)的所有頂級父節(jié)點(diǎn),以及easyUI Tree顯示選中節(jié)點(diǎn)的所有父節(jié)點(diǎn)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-02-02JavaScript全排列的六種算法 具體實(shí)現(xiàn)
這篇文章介紹了全排列的六種算法有,交換算法,鏈接算法,回溯算法等,有需要的朋友可以參考一下2013-06-06Object.defineProperty()函數(shù)之屬性描述對象
這篇文章主要介紹了Object.defineProperty()函數(shù)之屬性描述對象,JavaScript?提供了一個內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來描述對象的屬性,控制它的行為,比如該屬性是否可寫、可遍歷等等。這個內(nèi)部數(shù)據(jù)結(jié)構(gòu)稱為:屬性描述對象2022-09-09JavaScript實(shí)現(xiàn)網(wǎng)頁頭部進(jìn)度條刷新
這篇文章主要介紹了JavaScript實(shí)現(xiàn)網(wǎng)頁頭部進(jìn)度條刷新實(shí)例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-04-04