對於jQuery的整體架構,經典之處有三:
1、jQuery的無new構建
2、jQuery的鏈式調用
3、jQuery的插件接口
想必兄弟姐妹們也覺得這架構不錯哈,但有時又畏懼去拜讀大量的jQuery源碼,只好對它敬而遠之了。
哈哈,今天我就將其jQuery架構提煉出來,和大家一同分析研究下,jQuery是怎麼實現這三個經典之處的。
提煉的代碼如下:
<!DOCTYPE html> <head> <title>jQuery</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <script> (function(window){ var temp=window.$=function(){ return new temp.fn.init(); }; temp.fn=temp.prototype={ init:function(){ return this; }, attr:function(){ console.log(1); return this; } } temp.fn.init.prototype = temp.fn; })(window); //執行 console.log( $ ); </script> </body> </html>
是不是吃驚,怎麼會這麼少,哈哈哈,不必吃驚,事實就是這樣,如果你能理解其中的用意,那麼jQuery的整體架構也就差不多了哦。
下面我們就來一步一步地探其究竟。
回想一下,當我們調用jQuery方法時,是怎麼調用的呢?
答案:$(‘xx’)
是通過$來調用的,完全沒有new一個對象好不好。
jQuery是怎麼做到的呢。通過$()方法,返回一個實例對象。詳情見上代碼中的第11行。
這樣它就不用new了撒。
咦,第15行是什麼?return this?
what?
聰明的你可能會說,那麼11行處,return的this不就應該指向temp.fn嗎?因為this指向調用者嘛。
是的,this是指向它的調用者。
但是請仔細看看它是通過的new創建的一個實例哦。
那麼this就是指向的temp.fn.init這個構造函數創建出來的實例啦。
可能,你會問,我靠,為什麼new一下就變了呢。哈哈,看來有必要了解一下new的過程哦。
下面簡單闡述下new都做了什麼:
1、創建一個新的對象,這個對象的類型是object;
2、將這個對象的_prototype_隱指針指向構造函數的prototype
3、執行構造函數,當this關鍵字被提及的時候,使用新創建的對象的屬性;
4、返回新創建的對象
所以return new temp.fn.init()就是返回的temp.fn.init創建的對象啦。
大家注意到22行沒,temp.fn.init.prototype = temp.fn,這一句其實就是將init的原型鏈指向jquery的原型鏈啦,這樣temp.fn.init創建出來的實例就可以訪問jquery.prototype裡面的東東咯。也就是為什麼我們能夠通過$.fn擴展實例方法了哈。
對於鏈式調用,其實就是在每個調用的方法中return this;嘛。就如上述代碼中的19行一樣咯。
好啦,兄弟姐妹們,這下jQuery的架構三大特性被我們一步一步窺探清楚了哦。
總結:
jQuery利用匿名函數創建無污染的命名空間,通過window對象,將$符號拋給用戶操作,利用原型鏈的知識構建面向對象。
晚安everyone~