ECMAScript中的原型繼承

//ECMAScript中的原型繼承
//ECMAScript中的繼承主要是依靠原型鏈實現的。(關於原型鏈的介紹,詳見《高三》6.3.1章節 P162)

//本文示例主要爲了說明SubType.prototype=new SuperType()與SubType.prototype=SuperType.prototype的區別。
//從理解的角度來講,它們的區別貌似就是把SubType.prototype原型指向了父類的實例對象與指向父類原型對象的區別,這彷佛不可貴出結論,
//可是做爲一個有原則有嚴謹態度的人,我以爲就仍是有必要用實際行動來證實下想法的正確與否:

//定義父類型,並在類型內部定義了一個實例屬性superProperty:
function SuperType() {
    this.superProperty = "super property";
}

//定義原型方法
SuperType.prototype.getSuperValue = function () {
    return this.superProperty;
};

//定義子類型,並在子類型內部定義了實例屬性
function SubType() {
    this.subProperty = "sub property";
}

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

//定義子類型的原型方法
SubType.prototype.getSubValue = function () {
    return this.subProperty;
};

var instance = new SubType();
document.write(instance.superProperty + "<br/>"); //super property
document.write(instance.subProperty + "<br/>"); //sub property
document.write(instance.getSuperValue() + "<br/>"); //super property
document.write(instance.getSubValue() + "<br/>"); //sub property
//以上結果證實,SubType.prototype = new SuperType()會繼承父類的全部可見成員,無論是實例成員仍是原型成員。
document.write(instance.constructor + "<br/>");
//但要注意的是,SubType.prototype = new SuperType()其實是重寫了SubType的原型,因此SubType.prototype原型對象的constructor屬性也變爲了SuperType,
//即:instance.constructor==SuperType
//所以,繼承後判斷對象類型時要特別注意。

//若是採用SubType.prototype = SuperType.prototype繼承方式,會是什麼結果呢?
document.write(instance.superProperty + "<br/>"); //undefined
document.write(instance.subProperty + "<br/>"); //sub property
document.write(instance.getSuperValue() + "<br/>"); //undefined
document.write(instance.getSubValue() + "<br/>"); //sub property
//結論:採用這種純原型繼承的方式只繼承了父類原型上的成員,如上所示,父類定義的實例屬性superProperty值爲undefined,
//說明實例instance中不存在這個屬性,可是包含父類的原型方法getSuperValue()。
//與上面相同的是,instance.constructor仍是SuperType,由於這樣也至關因而重寫了SubType.prototype原型對象。this

相關文章
相關標籤/搜索