继承的子对象在JavaScript中共享相同的数组属性?

时间:2015-05-29 13:06:18

标签: javascript inheritance

> function Parent() {this.arr = [];}
undefined
> function Child() {}
undefined
> Child.prototype = new Parent();
{ arr: [] }
> child1 = new Child();
{}
> child2 = new Child();
{}
> child1.arr.push('From child1');
1
> child2.arr
[ 'From child1' ]
>

鉴于上述情况,我希望child2.arr为空,因为它是它自己的对象。如何让child1和child2包含自己的arr?谢谢!

3 个答案:

答案 0 :(得分:2)

您必须在构造函数中进行赋值:

function Child() {
  this.arr = this.arr ? this.arr.slice(0) : [];
}

为每个孩子提供原型.arr数组的副本(如果存在)。 (这只是一个浅层副本,这只是一个可能的例子。)对象属性的赋值总是涉及目标对象的本地(“自己的”)属性,但引用涉及原型链。

同样不是因为相当神秘的原因,初始化这样的原型并不是一个好主意。最好使用Object.create

Child.prototype = Object.create(Parent.prototype);

它为您提供了一个使用Parent原型对象作为其原型的新对象。

Here is a somewhat old but still interesting question on the topic.

答案 1 :(得分:1)

查看inheritance in javascript

基本上如果属性不在您正在查看的对象上,javascript会查看它的原型并尝试在那里找到它,直到它到达Object

您的Child没有属性arr,但它的原型new Parent()有,而且Child1Child2引用了该属性。 / p>

答案 2 :(得分:0)

function Parent() { this.arr = []; }
function Child() { this.parent = new Parent(); }
Child.prototype = new Parent();
var child1 = new Child();
var child2 = new Child();
child1.parent.arr.push('From child1');
alert(child2.parent.arr);