jQuery中最經常使用方法的就是jQuery( ),也即$( )。javascript
jQuery( )是一個函數調用,調用的結果是返回了一個jQuery實例對象。html
編寫組件一般的作法是將組件封裝成一個對象,須要用的時候則經過new運算符來建立一個實例。可是jQuery( )無須咱們用new手工實例化,它會自動返回一個實例。java
要實現這一點,最直接的思路就是定義這樣一個函數:框架
這麼作的問題是出現了死循環:函數
最簡單的解決辦法是藉助另外一個構造函數:oop
這麼作技術上並無什麼問題,可是jQuery的做者並無這麼作,多是出於某種技術潔癖或者我暫時不清楚的緣由,init被定義在了jQuery函數的原型中:this
經過init做爲中轉站,最終return出了一個jQuery實例。看上去更「雅緻」,更有「技術範」。spa
將上述代碼寫在一個自執行函數內(造成私有做用域,避免命名空間污染),就構成了jQuery的核心框架(簡化版):prototype
要理解上述結構的工做原理,必須理解JavaScript基於構造函數和原型的繼承模式。htm
當函數調用表達式前出現了關鍵字new,這個函數就成了構造函數,此時會依次發生四件事:
一、首先一個空對象(又稱實例)被建立出來了。
二、該空對象繼承構造函數的原型中的屬性和方法。這也是爲何要把方法都寫在構造函數的prototype裏。
三、該空對象被賦值給構造函數內部的this對象。
四、執行構造函數。若是構造函數中顯式的返回了一個對象,那麼new出的就再也不是新建立的空對象,而是return指定的對象。不然一概返回新建空對象。
具體參見阮一峯教程:http://javascript.ruanyifeng.com/oop/basic.html
因而jQuery( )的構造原理就很清晰了:每次調用jQuery( )都返回由構造函數init指定返回的this對象,而this對象已經被賦值爲那個新建立的空對象。因爲把jQuery.prototype都賦給了init.prototype,因此新建立的空對象繼承全部jQuery的方法。
構造函數init裏面的return this其實刪掉也無妨,至於做者爲啥要加這句,呃,多是由於知道的太多。