这个问题坑了我大半天。调bug调的心力交瘁。
起因是在做一个生成问卷的项目,其中涉及到各个题型类的继承,这里用一个简单的例子来说明。
好了,上代码:
先定义一个父类Animal:
function Animal(){
this.name = new Array();
}
接着是子类Dog:
function Dog(){}
Dog.prototype = new Animal(); //继承Animal
类定义完成后,新建2个Dog实例:
var tony = new Dog();
tony.name.push("tony");
var jessy = new Dog();
jessy.name.push("jessy");
console.info(jessy.name);
猜猜这里会输出啥?
原本以为是包含"jessy"的数组,结果没想到是["tony","jessy"]。
再看一个实例,这次新建2个Animal的实例:
var animal1 = new Animal();
var animal2 = new Animal();
animal1.name.push("animal1");
animal2.name.push("animal2");
console.info(animal2.name);
这里却是输出了 "animal2"!!!!!
后来联系上new的具体原理也就想明白了,new返回一个Animal实例,Dog的原型链指向这个Animal实例。
结果后来无论多少个new Dog(),也不会new Animal(),因此所有的Dog实例实在共享一个数组属性的。
结论也很简单:在继承时,如果父类属性中有对象,最好在子类中重新声明一遍。
另外一种做法也可以是父类在另外的函数中重新声明这个属性,但这样并不好。