九、理不清的繼承(續(xù))

javascript編入集

新年第一篇,再來閑談繼承。
上一次說了幾個(gè)屬性,繼承主要用的還是原型。在形式上,有多種實(shí)現(xiàn),但是在實(shí)際上會(huì)有各種差異。
有些看起來是像繼承的,只是通過一種捷徑實(shí)現(xiàn)了繼承的方式,但是那并不是繼承,所以在這里只列取在原型上拓展即可以食用的原型繼承。
檢驗(yàn)一個(gè)是否是真的繼承,首先判斷一下是否可以在原型上拓展,也就是new 對(duì)象之后,是不是在父類原型上的改變直接影響到子類上的原型內(nèi)容,如果不滿足這一點(diǎn),就不屬于繼承范疇。使用 instanceof 比較
首先建立父類

function Parent(name){
    this.name = name;
    this.give = function(){  console.log(this.name + ' give')}
}
Parent.prototype.handup = function(){
    console.log(this.name + 'hand up ');
}

建立好了父類。如何實(shí)現(xiàn)子類的繼承關(guān)系。

1. 常規(guī)原型繼承

使用prototype繼承

function Child(name){
    this.name = name;
}
Child.prototype = new Parent('Joy');
Child.prototype.constructor = Child; // 修正prototype的指向
var child = new Child('Tom');

這樣繼承來的對(duì)象上

child instanceof Parent ; // true

通過對(duì)原型鏈的改變,實(shí)現(xiàn)繼承。
這種繼承方式的好處就是單純的繼承。寫起來類似接口一樣,只有共有內(nèi)容,沒有私有屬性。因?yàn)?,所有的?nèi)容都是通過prototype取值,這一種繼承總體來說算是最常規(guī)繼承。
這種繼承的幾點(diǎn)缺陷

  1. 單繼承
  2. 無法直接調(diào)用父類的構(gòu)造函數(shù)。

在js中繼承使用其實(shí)是非常少的,并且對(duì)于多繼承來說就更少了,可以說忽略不計(jì)。
我看到還有一種寄生組合,說是因?yàn)檎{(diào)用了兩遍父類構(gòu)造函數(shù)。

function Parent(name){
    this.name = name;
    this.give = function(){  console.log(this.name + ' give')  }
}
function Child(name){
    Parent.call(this);
    this.name = name;
}
(function(){
    var supers = function(){}
    supers.prototype = Parent.prototype;
    Child.prototype = new supers;
})();

首先,父類自身的屬性和函數(shù),屬于私有范疇,并不需要繼承,這里用call破壞了原有的屬性值。
其次,使用自執(zhí)行函數(shù),將父類的prototype轉(zhuǎn)嫁到新的對(duì)象上去,減少了一次父類的調(diào)用,但是實(shí)際上并沒有減少兩次new的過程,并且原型上的new只有一次,所以說調(diào)用父類兩次的并不成立。
因此:不建議這種方式。因?yàn)樗鼘儆诋嬌咛碜愕姆绞健?/p>

Child.prototype.constructor這句話是重新修整constructor的指向。不修正時(shí)constructor指向的是原型類也就是Parent。但是如果new child.constructor() 重新 new一個(gè)該對(duì)象時(shí),需要正確指向它的構(gòu)造函數(shù)。

2. 其他繼承實(shí)現(xiàn)方式

很抱歉,暫時(shí)沒找著

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容