在(zài)jquery中,$('xxx').xxxx()這(zhè)種寫法,其實是(shì)通過jQuery.fn.extend({xxx: function() {}})的(de)方式進行方法綁定和(hé / huò)擴展的(de),而(ér)$.xxx()這(zhè)種方式的(de)方法是(shì)通過jQuery.extend({xxx: function() {}})的(de)方式進行方法綁定和(hé / huò)擴展的(de);
console.log(jQuery()) 其實是(shì)個(gè)對象,console.log(jQuery('#test')),如果有此元素存在(zài),看起來(lái)像數組,其實也(yě)是(shì)對象,這(zhè)種叫“類數組”;可以(yǐ)搜索看下類數組相關知識;
好,下面蘇州網站制作開始說(shuō)下這(zhè)個(gè)問題,第一(yī / yì /yí)是(shì)extend的(de)實現方法;第二是(shì)jquery爲(wéi / wèi)什麽能同時(shí)支持$.xxx()與$().xxx()這(zhè)兩種寫法;
第一(yī / yì /yí),extend的(de)實現方法;由于(yú)源碼較多,我在(zài)這(zhè)兒就(jiù)不(bù)直接展示出(chū)來(lái)了(le/liǎo),有興趣可以(yǐ)去找到(dào)看看;其實簡單講,extend主要(yào / yāo)用于(yú)對象的(de)合并,
但是(shì)從源碼可以(yǐ)看出(chū),當參數隻有一(yī / yì /yí)個(gè)對象的(de)時(shí)候,就(jiù)是(shì)直接将傳入對象合并到(dào)調用的(de)對象上(shàng) (即jquery或jquery.fn);
所以(yǐ),當調用jQuery.extend時(shí),就(jiù)會将傳入的(de)對象裏面的(de)方法合并寫入到(dào)jQuery對象上(shàng)面,就(jiù)可以(yǐ)對其進行擴展; 同理,使用jQuery.fn.extend時(shí),就(jiù)可以(yǐ)對jQuery.fn進行擴展;
第二,$.xxx()與$().xxx()兩種的(de)區别;第一(yī / yì /yí)種$.xxx()其實是(shì)調用的(de)jQuery對象上(shàng)面的(de)方法,也(yě)就(jiù)是(shì)通過jQuery.extend進行擴展的(de)方法;有人(rén)會說(shuō),jQuery是(shì)一(yī / yì /yí)個(gè)函數,但是(shì)函數在(zài)js也(yě)是(shì)對象,也(yě)可以(yǐ)向其添加屬性和(hé / huò)方法;而(ér)第二種$().xxx()則是(shì)調用的(de)jQuery.fn對象上(shàng)面的(de)方法,也(yě)就(jiù)是(shì)通過jQuery.fn.extend進行擴展的(de)方法;
第一(yī / yì /yí)種通過jQuery.extend進行擴展的(de)屬性和(hé / huò)方法是(shì)直接寫入jQuery對象,所以(yǐ)也(yě)就(jiù)可以(yǐ)直接通過$.xxx()的(de)方式調用,這(zhè)個(gè)很容易理解;
第二種,通過jQuery.fn.extend進行擴展的(de)方法和(hé / huò)屬性爲(wéi / wèi)何能夠通過$().xxx()進行調用呢;這(zhè)個(gè)就(jiù)要(yào / yāo)從jQuery的(de)整個(gè)架構來(lái)說(shuō);當執行$()時(shí),訪問了(le/liǎo)代碼:
Jquery=function(selector,conyext){
Return new jquery.fn.init(selector,context,rootjquery);
}
可以(yǐ)看出(chū),其實是(shì)實例化了(le/liǎo)一(yī / yì /yí)個(gè)jQuery.fn.init的(de)對象;在(zài)這(zhè)我們就(jiù)不(bù)再讨論jQuery.fn.init裏面具體幹了(le/liǎo)什麽,但可以(yǐ)通過源碼可以(yǐ)看出(chū),其最終執行了(le/liǎo)“return this”,也(yě)就(jiù)是(shì)返回了(le/liǎo)jQuery.fn.init的(de)實例對象;那如何通過$()可以(yǐ)訪問到(dào)jQuery.fn上(shàng)面的(de)屬性和(hé / huò)方法呢?就(jiù)是(shì)通過這(zhè)句代碼:
jquery.fn.init.prototype=jquery.fn;
它将jQuery.fn賦給了(le/liǎo)jQuery.fn.init.prototype,所以(yǐ),jQuery.fn.init的(de)實例對象也(yě)就(jiù)可以(yǐ)直接訪問jQuery.fn上(shàng)面的(de)方法和(hé / huò)屬性了(le/liǎo);所以(yǐ),當你通過$().xxx()時(shí),其實訪問了(le/liǎo)jQuery.fn.xxx()方法;
其實,這(zhè)個(gè)問題去看jquery源碼就(jiù)能很清楚的(de)知道(dào)了(le/liǎo),要(yào / yāo)明白jquery的(de)方法擴展方式,真正理解其主要(yào / yāo)架構方式。蘇州網站建設提醒小夥伴要(yào / yāo)多看基礎理論,熟悉基礎用法。