1.jquery中$是神馬?$.fn又是神馬?
稍微有jquery經(jīng)驗(yàn)的都知道在jquery中$等價(jià)于jQuery,在控制臺(tái)一試便知:
我們?cè)趈query(1.8.3)源碼中也能找到下面代碼:
其實(shí)在jquery中$就是一個(gè)函數(shù)function,當(dāng)我們執(zhí)行$()時(shí)會(huì)得到一個(gè)jquery對(duì)象,得到的jquery對(duì)象的類型是object類型,而不是數(shù)組。除此之外$也是個(gè)對(duì)象,因?yàn)樵?上面也可以定義方法和屬性,比如常見(jiàn)的$.ajax。
而$.fn就是$的原型,,在源碼中我們也能找到j(luò)Query.fn = jQuery.prototype
jquery對(duì)象中的上百種方法就是定義在原型中,為什么定義在原型中?這就是js面向?qū)ο蟮闹匾R(shí)了,可參考我的這篇文章對(duì)于jquery這么多方法的庫(kù)來(lái)說(shuō),方法定義在原型上極大的節(jié)省了內(nèi)存。這里只需知道$.fn就是$的原型就行。
插件的寫(xiě)法
插件說(shuō)白了就是為jquery庫(kù)添加特定的方法,插件的形式一般開(kāi)頭為$.fn.extend?在源碼中我們也能看到很多這樣的例子:
所以一個(gè)常見(jiàn)的插件的基本樣式應(yīng)該如下(注釋寫(xiě)的很詳細(xì),就不再一一贅述):
/*插件名:
作者:
日期:等信息*///一個(gè)匿名自執(zhí)行函數(shù),劃分一個(gè)獨(dú)立的作用域,不至于插件中的變量干擾jquery
;(function($){//開(kāi)始寫(xiě)上; 為防止代碼壓縮出錯(cuò)
//為jquery擴(kuò)展方法,也就是插件的主體$.fn.extend({//方法名"method" :function(opts){//定義插件的默認(rèn)參數(shù)vardefault={
width ://定義默認(rèn)寬度height ://定義默認(rèn)高度speed ://定義默認(rèn)速度//等等各種默認(rèn)參數(shù)}//有些參數(shù)用戶直接使用默認(rèn),有些參數(shù)用戶要使用自己定義的//自定義參數(shù)替換默認(rèn)參數(shù)//var option = $.extend(default,opts); //為什么不用此行代碼?為了保護(hù)默認(rèn)參數(shù)//extend方法中opts會(huì)永久取代default,所以新加一個(gè)空對(duì)象{}來(lái)保存本次所使用的參數(shù),下次使用default依然不變varoption = $.extend({},default,opts);this.each(function(){//用each處理選擇器選中的一個(gè)或多個(gè)dom節(jié)點(diǎn)/*此處是插件處理過(guò)程代碼*/});//最后別忘了保持jquery的鏈?zhǔn)讲僮鳎ㄒ暻闆r而定)returnthis; //返回被選中的元素節(jié)點(diǎn),以供后續(xù)操作。
}
});
})(jQuery)//傳入jQuery是為更快查找,避免沿作用域鏈往上層查找,提高性能
常見(jiàn)的插件寫(xiě)法就是這樣,據(jù)說(shuō)90%以上的插件就是用$.fn.extend()方式實(shí)現(xiàn)的,因?yàn)閖query的特色就是先選擇dom節(jié)點(diǎn),然后鏈?zhǔn)教幚磉@些節(jié)點(diǎn)。還有不常見(jiàn)的$.extend()插件編寫(xiě)方式,該方式編寫(xiě)的插件是在jquery命名空間內(nèi)添加方法,也就是說(shuō)在使用時(shí)不需要先選擇dom節(jié)點(diǎn),使用時(shí)直接$.method()即可。
插件的命名和代碼壓縮
命名默認(rèn)采用jquery.method.js (method代指插件名),除此之外最好弄一個(gè)壓縮版:jquery.method.min.js 至于代碼的壓縮,包括去空格,去換行,其實(shí)還有方法名的簡(jiǎn)寫(xiě)操作,比如方法名叫removeAttr,很長(zhǎng),那么可以直接改寫(xiě)為一個(gè)字母a,這也是短化代碼的方法,除此之外還有if else 轉(zhuǎn)換為三木運(yùn)算等壓縮方式。(轉(zhuǎn))