父类属性中有对象的情况下继承该如何正确的实现

这个问题坑了我大半天。调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实例实在共享一个数组属性的。

结论也很简单:在继承时,如果父类属性中有对象,最好在子类中重新声明一遍。

另外一种做法也可以是父类在另外的函数中重新声明这个属性,但这样并不好。

你可能感兴趣的:(父类属性中有对象的情况下继承该如何正确的实现)