jQuery內(nèi)部實(shí)例化過程分析

jQuery的所有代碼放在了自調(diào)用的匿名函數(shù)中,防止命名污染

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

我們?cè)谑褂?("div")獲取Dom元素,看起來就像是調(diào)了一個(gè)普通的函數(shù),每次調(diào)用jQuery就會(huì)實(shí)例化一個(gè)對(duì)象

一般訪問構(gòu)造函數(shù)中的方法是這樣操作,代碼如下:

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

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

應(yīng)該是jQuery內(nèi)部幫我們實(shí)現(xiàn)了,調(diào)用jQuery函數(shù)的時(shí)候,返回值就應(yīng)該是一個(gè)實(shí)例對(duì)象

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

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

Paste_Image.png

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

其實(shí)這個(gè)問題jQuery內(nèi)部的實(shí)現(xiàn)方式卻相當(dāng)高明

//閉包環(huán)境,防止與外部命名污染
    (function (window, undefined) {
        var jQuery = function (selector) {
            //返回init構(gòu)造函數(shù)的實(shí)例
            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();
        //導(dǎo)出接口,外部就可以訪問了,這也是為什么我們用$("div")也能得到Dom元素
        window.jQuery = window.$ = jQuery;
    })(window)

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

原因是執(zhí)行了這行代碼

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

init里面的this戈鲁,受制于作用域的限制辅柴,訪問不到j(luò)Query.prototype其它的屬性
jQuery內(nèi)部的一句'jQuery.fn.init.prototype=jQuery.fn'
將init的原型指向了jQuery的原型,這樣一來,jQuery產(chǎn)生的實(shí)例對(duì)象就能夠訪問jQuery原型上的屬性了
jQuery的原型中有html方法,這樣init的實(shí)例也能訪問了,因?yàn)樵屠^承

源碼中jQuery.fn是啥? 實(shí)際上就是jQuery.prototype

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诵闭,隨后出現(xiàn)的幾起案子缅糟,更是在濱河造成了極大的恐慌,老刑警劉巖饭耳,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偶垮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡叫惊,警方通過查閱死者的電腦和手機(jī)款青,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霍狰,“玉大人抡草,你說我怎么就攤上這事≌崤鳎” “怎么了康震?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宾濒。 經(jīng)常有香客問我腿短,道長(zhǎng),這世上最難降的妖魔是什么绘梦? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任橘忱,我火速辦了婚禮,結(jié)果婚禮上卸奉,老公的妹妹穿的比我還像新娘钝诚。我一直安慰自己,他們只是感情好榄棵,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布凝颇。 她就那樣靜靜地躺著,像睡著了一般疹鳄。 火紅的嫁衣襯著肌膚如雪拧略。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天尚辑,我揣著相機(jī)與錄音辑鲤,去河邊找鬼。 笑死杠茬,一個(gè)胖子當(dāng)著我的面吹牛月褥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓢喉,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼宁赤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了栓票?” 一聲冷哼從身側(cè)響起决左,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤愕够,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后佛猛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惑芭,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年继找,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遂跟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婴渡,死狀恐怖幻锁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情边臼,我是刑警寧澤哄尔,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站柠并,受9級(jí)特大地震影響岭接,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堂鲤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一亿傅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘟栖,春花似錦葵擎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寓涨,卻和暖如春盯串,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戒良。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工体捏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糯崎。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓几缭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親沃呢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子年栓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情薄霜,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式某抓。簡(jiǎn)單...
    舟漁行舟閱讀 7,777評(píng)論 2 17
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    程序員poetry閱讀 114,421評(píng)論 24 450
  • 1纸兔、應(yīng)用卡頓的原理,以及針對(duì)界面切換卡頓和屏幕滑動(dòng)卡頓提出典型的解決思路 卡頓原理: 1)大多數(shù)手機(jī)的屏幕刷新頻率...
    Jimmy5Zhang閱讀 366評(píng)論 0 5
  • 游記 今天我和往常一樣早早就起來了否副,但今天不同的是我休班汉矿,我要帶著老婆和孩子出去旅游...
    夏俊智爸爸閱讀 310評(píng)論 0 1
  • 閱讀有主題閱讀,游走當(dāng)然有主題游走副编。隨心所欲飄飄蕩蕩的固然美妙负甸,但是這個(gè)可能更適合一個(gè)純?nèi)荒吧牡胤搅髑俊T谑煜さ某鞘?..
    簡(jiǎn)彤閱讀 241評(píng)論 0 0