原型链很强大,可以用来实现继承,但也存在一些问题。其中最主要的问题是来自包含引用类型值的原型。看如下例子:
function Super() {
this.colors = ['red', 'blue', 'green'];
}
function Sub() {
}
Sub.prototype = new Super();
var instance1 = new Sub();
instance1.colors.push('black');
alert(instance1.colors); //red,blue,green,black
var instance2 = new Sub();
alert(instance2.colors); //red,blue,green,black
我们看到Sub()的两个实例,由于Sub.prototype继承了Super(),因此这两个实例实际上是共享了Super的属性和方法,因此colors是Sub所有实例共享的属性,而这并不是我们的意图。
第二个问题是:在创建子类型的实例时,不能向超类型的构造函数中传递函数。
1.来看看第一个方法借用构造函数:
function Super(name) {
this.name = name;
}
function Sub