原型鏈的繼承就是將子類的prototype.__proto__鏈接到父類的prototype,借此完成原型鏈
child.prototype.__proto__.= parent.prototype
實(shí)例化的對(duì)象沒有prototype,prototype是函數(shù)特有的屬性,所有的對(duì)象都有__proto__, 這是指向?qū)嵗@個(gè)對(duì)象的類的prototype,所有對(duì)象的原型鏈最后是null
下面是經(jīng)典的原型鏈繼承的例子,我借此解釋一下
function extend(Child, Parent) {
var F = function(){};
//將父類的prototype復(fù)制到F函數(shù)中
F.prototype = Parent.prototype;
/*new F()實(shí)例化F()實(shí)際的作用是生成了一個(gè)下面這個(gè)對(duì)象
{
__proto__: {
//Parent.prototype
}
}
這樣就完成了
Child.prototype.__proto__ = Parent.prototype這個(gè)原型鏈繼承的核心內(nèi)容
*/
Child.prototype = new F();
//Parent.prototype的constructor是Parent,為了準(zhǔn)確這里要手動(dòng)將Child.prototype.constructor改為Child
Child.prototype.constructor = Child;
//這里是為了代碼實(shí)際開發(fā)時(shí)方便調(diào)用父類,不用使用__proto__
Child.uber = Parent.prototype;
}
涉及到繼承這一塊,Javascript 只有一種結(jié)構(gòu),那就是:對(duì)象。在 javaScript 中,每個(gè)對(duì)象都有一個(gè)指向它的原型(prototype)對(duì)象的內(nèi)部鏈接。這個(gè)原型對(duì)象又有自己的原型,直到某個(gè)對(duì)象的原型為 null 為止(也就是不再有原型指向),組成這條鏈的最后一環(huán)。這種一級(jí)一級(jí)的鏈結(jié)構(gòu)就稱為原型鏈(prototype chain)。---MDN原型鏈描述
上面這句話有些長(zhǎng),看代碼獲取會(huì)直觀一點(diǎn)
childClass.prototype.__proto__ == parantClass.prototype
childInstance.__proto__ == childClass.prototype
childInstance.__proto__.__proto__ == childClass.prototype.__proto__ == parantClass.prototype
對(duì)于這里的childInstance.__proto__ == childClass.prototype,是由關(guān)鍵字new實(shí)現(xiàn)的,具體可以看我的另外一篇文章new到底做了什么
參考文獻(xiàn)
Javascript繼承機(jī)制的設(shè)計(jì)思想
Javascript面向?qū)ο缶幊蹋ǘ簶?gòu)造函數(shù)的繼承
繼承與原型鏈