原型和原型鏈

  • 構(gòu)造函數(shù)

    是一種特殊的方法贪庙。主要用來在創(chuàng)建對象時初始化對象蜘犁, 即為對象成員變量賦初始值,總與new運算符一起使用在創(chuàng)建對象的語句中止邮。特別的一個類可以有多個構(gòu)造函數(shù) 这橙,可根據(jù)其參數(shù)個數(shù)的不同或參數(shù)類型的不同來區(qū)分它們 即構(gòu)造函數(shù)的重載奏窑。
    人話:用來把一個對象構(gòu)建起來的函數(shù)(給這個對象設(shè)定屬性啊參數(shù)啊定義之類的),就叫構(gòu)造函數(shù)屈扎。

    function Foo (name, age) {    //構(gòu)造函數(shù)首字母大寫
          this.name = name;
          this.age = age;
          this.class = 'class-1';
          return this;
    }
    var  f1 = new Foo (' zhangsan ', 20);
    var  f2 = new Foo (' zhangsan ', 20); //Foo就是f1和f2的構(gòu)造函數(shù)埃唯。
    

    幫助理解

    • var a = {} 其實是var a = new Object() 的語法糖。

    • var a = [] 其實是var a = nwe Array() 的語法糖鹰晨。

    • function Foo () {} 相當(dāng)于 var Foo = new Function()

    • 使用 instanceof 判斷一個函數(shù)是否是一個變量的構(gòu)造函數(shù)

      后面出現(xiàn)的Js內(nèi)置函數(shù)墨叛,就是等號前面變量的構(gòu)造函數(shù)


  • 原型規(guī)則

    • 所有引用類型(對象、數(shù)組模蜡、函數(shù))漠趁,都有對象特性,即都可以自由擴展屬性哩牍。
      var obj = {};   obj.a = 100;
      var arr = [];   arr.a = 100;
      function fn () {};  fn.a = 100;  //都可以去給他們添加屬性棚潦。
      
    • 所有的引用類型(對象、數(shù)組膝昆、函數(shù)),都有一個 " __proto__ " 屬性(約定稱之為隱式原型)叠必,屬性只是一個普通的對象荚孵。
      console.log (obj.__proto__);
      console.log (arr.__proto__);
      console.log (fn.__proto__);  //符合第一條規(guī)則,可以自由拓展屬性纬朝。
      
    • 所有的函數(shù)收叶,都有一個 “ prototype ” 屬性(約定稱之為顯示原型),屬性值也是一個普通對象共苛。
      console.log (fn.prototype); //函數(shù)也是引用類型判没,所以同時也符合第一條。
      
    • 所有的引用類型(對象隅茎、數(shù)組澄峰、函數(shù)), " __proto__ " 屬性值指向它的構(gòu)造函數(shù)的 “ prototype ” 屬性值
      console.log (obj.__proto__ === Object.prototype);  //true
      //obj是一個對象辟犀,而Object就是obj的構(gòu)造函數(shù)俏竞。符合這一條
      
    • 當(dāng)試圖得到一個對象(函數(shù)、數(shù)組)的某個屬性時堂竟,如果對象本身沒有該屬性魂毁,就會去該對象的 __proto__(即該對象的構(gòu)造函數(shù)的prototype)中尋找。
      //創(chuàng)建一個構(gòu)造函數(shù)Foo
      function Foo (name, age) {
            this.name = name;
      };
      
      //給Foo的顯示原型添加一個屬性(函數(shù))
      Foo.prototype.alertName = function () {
            alert (this.name);
      };
      
      //創(chuàng)建對象
      var f = new Foo ('zhangsan');  //Foo 就是 f 的構(gòu)造函數(shù)
      f.printName = function () {
            console.log (this.name);
      };
      
      //測試
      f.printName ();  //f 本身有這個屬性出嘹,所以沒問題席楚。
      f.alertName ();  //f 本身沒有這個屬性,所以就去f.__proto__里尋找税稼,
                       //即到它的構(gòu)造函數(shù)Foo的prototype里尋找烦秩,并且可以找到垮斯。
                       //里面的this永遠只想自身f
      
    • 補充——循環(huán)對象自身的屬性
      當(dāng)我們循環(huán)獲取對象自身屬性的時候,并不希望獲取到其隱式原型(其構(gòu)造函數(shù)的顯示原型)的屬性闻镶。
      var item;
      for (intem in f) {
            if (f.hasOwnProperty(item)) {
                  cosole.log (item);
            //雖然瀏覽器會在for in中屏蔽原型屬性甚脉,但加上會保證健壯性。
            }
      }
      



  • 原型鏈

    在上面铆农,我們可以了解到牺氨,f.printName () 和 f.alertName () 是可以被找到的。
    但如果再加上 f.toString () 呢墩剖,f 及其 Foo.prototype 中都沒有這個屬性猴凹。

    上面所說 f.__proto__ 即 Foo.prototype 的屬性值就是一個普通對象,也就是說有構(gòu)造函數(shù)即Object岭皂。參照上面的原型規(guī)則可得出以后流程圖郊霎。

    f.\_\_proto__ (Foo.prototype)中找,找不到爷绘。
    f.__proto__.__proto__ (Foo.prototype.__proto__)(Object.prototype)里找
    就找到了书劝。
    但是,如果還是找不到呢
    ③ 繼續(xù)土至,到 Object.prototype.__proto__(有完沒完购对?)
    ④ 到了這里,為了避免死循環(huán)陶因,Js規(guī)定骡苞,這里返回null。

    圖片參考自慕課網(wǎng)



  • instanceof 判斷函數(shù)是否是構(gòu)造函數(shù)

    • f instanceof Foo ——判斷Foo是否為 f 的構(gòu)造函數(shù)楷扬。
      答案是肯定的解幽,邏輯是 f 的__proto__ 一層層往上看能否對應(yīng)到 Foo.prototype

    • 在嘗試 f instanceof Object ——判斷Object
      答案也是肯定的。網(wǎng)上找也可以找到 Object.prototype



Wait me back

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烘苹,一起剝皮案震驚了整個濱河市躲株,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌螟加,老刑警劉巖徘溢,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捆探,居然都是意外死亡然爆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門黍图,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曾雕,“玉大人,你說我怎么就攤上這事助被∑收牛” “怎么了切诀?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搔弄。 經(jīng)常有香客問我幅虑,道長,這世上最難降的妖魔是什么顾犹? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任倒庵,我火速辦了婚禮,結(jié)果婚禮上炫刷,老公的妹妹穿的比我還像新娘擎宝。我一直安慰自己,他們只是感情好浑玛,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布绍申。 她就那樣靜靜地躺著,像睡著了一般顾彰。 火紅的嫁衣襯著肌膚如雪极阅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天涨享,我揣著相機與錄音涂屁,去河邊找鬼。 笑死灰伟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的儒旬。 我是一名探鬼主播栏账,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼栈源!你這毒婦竟也來了挡爵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤甚垦,失蹤者是張志新(化名)和其女友劉穎茶鹃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艰亮,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡闭翩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迄埃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疗韵。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖侄非,靈堂內(nèi)的尸體忽然破棺而出蕉汪,到底是詐尸還是另有隱情流译,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布者疤,位于F島的核電站福澡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驹马。R本人自食惡果不足惜革砸,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窥翩。 院中可真熱鬧业岁,春花似錦、人聲如沸寇蚊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仗岸。三九已至允耿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扒怖,已是汗流浹背较锡。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盗痒,地道東北人蚂蕴。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像俯邓,于是被迫代替她去往敵國和親骡楼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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