原型链的基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法。
原型链的基本概念:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。那么,如果让这个原型对象等于另一个类型的实例,这个原型对象就会包含一个指向另外一个原型对象的内部指针,另一个原型对象也会包含一个指向另一个构造函数的指针。
概念读起来比较不容易懂,看图就懂了:
原型链的基本模式:
function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
return this.property;
}
function SubType(){
this.subproperty = false;
}
//继承了SuperType,继承是通过创建SuperType的实例,并将该实例赋给SubType.prototype实现的,实现的本质是重写原型对象,代之以一个新类型的实例。原来存在于SuperType的实例中的所有方法和属性,现在也存在于SubType.prototype中。
SubType.prototype = new SuperType();
//给SubType.prototype添加getSubValue方法,在继承了SuperType的属性和方法的基础上,又添加了一个方法
SubType.prototype.getSubValue = function(){
return this.subproperty;
}
var instance = new SubType();
alert(instance.getSuperValue()); //true
原型链的问题:包含引用类型的原型属性会被所有实例共享
function SuperType(){
this.colors = ["red", "blue", "green"];
}
function SubType(){
}
//继承了SuperType
SubType.prototype = new SuperType();
var instance1 = new SubType();
instance1.colors.push("black");
alert(instance1.colors); //"red, blue, green, black"
var instance2 = new SubType();
alert(instance2.colors); //"red, blue, green, black"