ECMAScript只支持實現繼承(繼承實際的方法),主要依靠原型鏈來實現。
原型鏈
基本思想:利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。
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
實現的本質是重寫原型對象,代之以一個新類型的實例。
即,原來存在于SuperType的實例中的所有屬性和方法,現在也存在與SubType.prototype中了。
確定了繼承關系之后,給SubType.prototype添加了一個方法,這樣就在繼承了SuperType的屬性和方法的基礎上又添加了一個新方法。
子類型有時要覆蓋超類型中的某個方法,或者需要添加超類型中不存在的某個方法。
——給原型添加方法的代碼一定要放在替換原型的語句之后。
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
通過原型鏈實現繼承時,不能使用對象字面量創建原型方法,因為這樣做會重寫原型鏈。
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()); //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、創建子類型的實例時,沒有辦法在不影響所有對象實例的情況下,給超類的構造函數傳遞參數。