互聯網開(kāi)發&品牌全案設計(jì)

12年(nián) 實戰經驗,品質服務

jQuery: $.xxx()與$().xxx()中的(de)$,為(wèi)什(shén)麽能(néng)同時(shí)'支持兩種寫法?

2018-03-01 關鍵詞: 2294

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