繼承 (js原型鏈)
阿新 • • 發佈:2018-08-21
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原型鏈)