【面向?qū)ο蟮某绦蛟O(shè)計(3)】原型鏈繼承

ECMAScript只支持實現(xiàn)繼承(繼承實際的方法),主要依靠原型鏈來實現(xiàn)。

原型鏈

基本思想:利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。

function SuperType(){
    this.property = true;
}
SuperType.prototype.getSuperValue = function(){
    return this.property;
};

function SubType(){
    this.subproperty = false;
}

//繼承了SuperType
SubType.prototype = new SuperType();

SubType.prototype.getSubValue = function(){
    return this.subproperty;
};

var instance = new SubType();
alert(instance.getSuperValue());   //true

實現(xiàn)的本質(zhì)是重寫原型對象,代之以一個新類型的實例。

即,原來存在于SuperType的實例中的所有屬性和方法,現(xiàn)在也存在與SubType.prototype中了。
確定了繼承關(guān)系之后,給SubType.prototype添加了一個方法,這樣就在繼承了SuperType的屬性和方法的基礎(chǔ)上又添加了一個新方法。

子類型有時要覆蓋超類型中的某個方法,或者需要添加超類型中不存在的某個方法。
——給原型添加方法的代碼一定要放在替換原型的語句之后。

function SuperType(){
    this.property = true;
}
SuperType.prototype.getSuperValue = function(){
    return this.property;
};

function SubType(){
    this.subproperty = false;
}

//繼承了SuperType
SubType.prototype = new SuperType();

//添加新方法
SubType.prototype.getSubValue = function(){
    return this.subproperty;
};
//重寫超類型中的方法
SubType.prototype.getSuperValue = function(){
    return false;
};

var instance = new SubType();
alert(instance.getSuperValue());  //false

通過原型鏈實現(xiàn)繼承時,不能使用對象字面量創(chuàng)建原型方法,因為這樣做會重寫原型鏈。

function SuperType(){
    this.property = true;
}
SuperType.prototype.getSuperValue = function(){
    return this.property;
};

function SubType(){
    this.subproperty = false;
}

//繼承了SuperType
SubType.prototype = new SuperType();

//使用字面量添加新方法,會導(dǎo)致上一行代碼無效
SubType.prototype = {
    getSubValue : function(){
        return this.subproperty;
    }
};

var instance = new SubType();
alert(instance.getSuperValue());  //error

缺點:
1、包含引用類型值的原型的繼承會出問題。

function SuperType(){
    this.color=["red","blue","green"];
}

function SubType(){
}

//繼承了SuperType
SubType.prototype = new SuperType();

var instance1 = new SubType();
instance1.color.push("black");
alert(instance1.color);         //"red,blue,green,black"

var instance2 = new SubType();
alert(instance2.color);         //red,blue,green,black

2、創(chuàng)建子類型的實例時,沒有辦法在不影響所有對象實例的情況下,給超類的構(gòu)造函數(shù)傳遞參數(shù)。


實踐中會很少單獨使用原型鏈!??!

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

相關(guān)閱讀更多精彩內(nèi)容

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