Javascript原型鏈

原型鏈的繼承就是將子類的prototype.__proto__鏈接到父類的prototype,藉此完成原型鏈

child.prototype.__proto__.= parent.prototype

實例化的對象沒有prototype,prototype是函數特有的屬性,所有的對象都有__proto__, 這是指向實例化這個對象的類的prototype,所有對象的原型鏈最後是null

下面是經典的原型鏈繼承的例子,我藉此解釋一下

  function extend(Child, Parent) {
    var F = function(){};
    //將父類的prototype複製到F函數中
    F.prototype = Parent.prototype;
    /*new F()實例化F()實際的作用是生成了一個下面這個對象
    {
       __proto__: {
           //Parent.prototype
       }
    }
    這樣就完成了
    Child.prototype.__proto__ = Parent.prototype這個原型鏈繼承的核心內容
    */
    Child.prototype = new F();
    //Parent.prototype的constructor是Parent,爲了準確這裏要手動將Child.prototype.constructor改爲Child
    Child.prototype.constructor = Child;
    //這裏是爲了代碼實際開發時方便調用父類,不用使用__proto__
    Child.uber = Parent.prototype;
  }

涉及到繼承這一塊,Javascript 只有一種結構,那就是:對象。在 javaScript 中,每個對象都有一個指向它的原型(prototype)對象的內部鏈接。這個原型對象又有自己的原型,直到某個對象的原型爲 null 爲止(也就是不再有原型指向),組成這條鏈的最後一環。這種一級一級的鏈結構就稱爲原型鏈(prototype chain)。—MDN原型鏈描述

上面這句話有些長,看代碼獲取會直觀一點

childClass.prototype.__proto__ == parantClass.prototype

childInstance.__proto__ == childClass.prototype

childInstance.__proto__.__proto__ == childClass.prototype.__proto__ == parantClass.prototype

對於這裏的childInstance.__proto__ == childClass.prototype,是由關鍵字new實現的,具體可以看我的另外一篇文章new到底做了什麼

參考文獻
Javascript繼承機制的設計思想
Javascript面向對象編程(二):構造函數的繼承
繼承與原型鏈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章