jQuery內部實例化過程分析

jQuery的所有代碼放在了自調用的匿名函數中,防止命名污染

(function( window, undefined ) {
      ------
})( window );

我們在使用$("div")獲取Dom元素,看起來就像是調了一個普通的函數,每次調用jQuery就會實例化一個對象

一般訪問構造函數中的方法是這樣操作,代碼如下:

function jQuery(selector) {
      this.html= function () {
          console.log("我是綠豆糕");
      }
  }
  new jQuery("div").html();

上邊代碼每次訪問方法都要new一下,而我們看到的jQuery是這樣的方式調用的jQuery("div").html(),怎么才能達到這樣的效果呢? 想一想....

應該是jQuery內部幫我們實現了,調用jQuery函數的時候,返回值就應該是一個實例對象

function jQuery(selector) {
       this.html= function () {
          console.log("我是綠豆糕");
      }
      return new jQuery(selector);
  }
  jQuery("div").html();

這樣做思路沒有問題,讓我們愉快的運行一下

Paste_Image.png

糟糕.....整成堆棧溢出了,原因是new jQuery(),出現自己調用自己,發生遞歸卻沒有結束條件,這可咋整

其實這個問題jQuery內部的實現方式卻相當高明

//閉包環境,防止與外部命名污染
    (function (window, undefined) {
        var jQuery = function (selector) {
            //返回init構造函數的實例
            return new jQuery.prototype.init(selector);
        }
        jQuery.prototype = {
            constructor: jQuery,
            init: function (selector) {

            },
            html: function () {
                console.log("我是綠豆糕");
            }
        }
        //init的原型指向jQuery的原型,這樣我們就能訪問jQuery原型中的方法了
        jQuery.prototype.init.prototype = jQuery.prototype;
        jQuery("div").html();
        //導出接口,外部就可以訪問了,這也是為什么我們用$("div")也能得到Dom元素
        window.jQuery = window.$ = jQuery;
    })(window)

調用jQuery函數返回的是return new jQuery.prototype.init(selector),但是為什么html方法不在init構造函數內部也能調用成功,打印出"我是綠豆糕"呢?

原因是執行了這行代碼

  jQuery.prototype.init.prototype = jQuery.prototype;

init里面的this,受制于作用域的限制,訪問不到jQuery.prototype其它的屬性
jQuery內部的一句'jQuery.fn.init.prototype=jQuery.fn'
將init的原型指向了jQuery的原型,這樣一來,jQuery產生的實例對象就能夠訪問jQuery原型上的屬性了
jQuery的原型中有html方法,這樣init的實例也能訪問了,因為原型繼承

源碼中jQuery.fn是啥? 實際上就是jQuery.prototype

jQuery.fn = jQuery.prototype = {
    ......
}
jQuery.fn.init.prototype = jQuery.fn;
等效于我們剛才分析的這句
 jQuery.prototype.init.prototype = jQuery.prototype;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 工廠模式類似于現實生活中的工廠可以產生大量相似的商品,去做同樣的事情,實現同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,827評論 2 17
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    前端進階之旅閱讀 114,773評論 24 450
  • 1、應用卡頓的原理,以及針對界面切換卡頓和屏幕滑動卡頓提出典型的解決思路 卡頓原理: 1)大多數手機的屏幕刷新頻率...
    Jimmy5Zhang閱讀 370評論 0 5
  • 游記 今天我和往常一樣早早就起來了,但今天不同的是我休班,我要帶著老婆和孩子出去旅游...
    夏俊智爸爸閱讀 331評論 0 1
  • 閱讀有主題閱讀,游走當然有主題游走。隨心所欲飄飄蕩蕩的固然美妙,但是這個可能更適合一個純然陌生的地方。在熟悉的城市...
    簡彤閱讀 253評論 0 0