原型鏈的繼承就是將子類的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到底做了什麼