1. 程式人生 > >繼承 (js原型鏈)

繼承 (js原型鏈)

gets 屬性和方法 其他 span erl log js原型鏈 思想 .get

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

1.構造函數、原型、實例的關系:

每個構造函數都有原型屬性(Prototype),指向一個原型對象(函數創建相應產生原型對象),每個原型對象包含一個屬性(constructor),指向構造函數。每個實例都包含指向原型對象的內部指針(_proto_)。

如果令實例A的原型對象等於另一個構造函數的實例B,那麽A的原型對象將包含指向B的原型對象的內部指針(_proto_),所以A可以繼承來自B的原型對象中的屬性和方法。相應的,B的原型對象也可以引用其他實例的原型對象(通過實例的賦值方法)。按照這種方法,一層層遞進,可以構成實例和原型的鏈條(即原型鏈)。

註意一點:實例B的原型對象的構造器(constructor)屬性是指向B的構造函數,而A的原型對象相當於引用B的原型對象,A的原型對象被重寫!A的構造器屬性指向B的構造函數。

最後,原型鏈的末端為Object的原型對象。因為一切都是對象,所有的函數都是Object的實例。

2.實現原型鏈的基本模型:

function Supertype(){

this.property=true;

}
Supertype.prototype.getSuperValue=function(){
return this.property;
};
function SubType(){
this.subproperty=false;
}
SubType.prototype=new Supertype();
SubType.prototype.getSubValue=function(){
return this.subproperty;
};
var instance=new SubType();
console.log(instance.getSuperValue()); //true
console.log(instance.constructor);
//f Supertypr(){
this.property=true;
}
其中構造函數中的屬性僅包含在實例對象中,不包含在它的原型對象中,原型對象中的屬性和方法需要通過.prototype.name=value來進行添加。故,property位於Subtype.prototype中(將實例
後的對象賦給Subtype.prototype),
而不在SuperType.prototype
 

繼承 (js原型鏈)