> 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?谢谢!
答案 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)
基本上如果属性不在您正在查看的对象上,javascript会查看它的原型并尝试在那里找到它,直到它到达Object
。
您的Child
没有属性arr
,但它的原型new Parent()
有,而且Child1
和Child2
引用了该属性。 / 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);