2015-06-21 103 views
0

我想要一个继承数组属性的对象和一个方法将元素添加到继承的数组。但是,继承的方法yChange()更改原型数组而不是继承的数组。 This question解释了不良行为发生的原因。但无法弄清楚如何获得理想的行为。如何使用继承的方法更改继承的数组?

var parent = { 
    x: 0, 
    y: [], 
    xChange: function() {this.x += 1}, 
    yChange: function() {this.y.push(1)} 
}; 

var child = Object.create(parent); 
child.xChange(); 
child.yChange(); 

console.log(child.x, child.y); // 1 [1] 
console.log(parent.x, parent.y); // 0 [1] 

期望:

console.log(child.x, child.y); // 1 [1] 
console.log(parent.x, parent.y); // 0 [] 
+0

是否有某些原因您不能使用构造函数? – Ryan

+0

我可以,但我想使用对象字面值和'Object.create()'。 –

回答

1

菲利克斯是正确的任务是改变child.y。在你的例子中,你可以检查内存地址是否相同,然后为新实例分配一个新的匹配的地址。像这样:

var parent = { 
    x: 0, 
    y: [], 
    xChange: function() {this.x += 1}, 
    yChange: function() { 
     if (this.y == Object.getPrototypeOf(this).y) 
      this.y = new Array() 
     this.y.push(1) 
    } 
}; 

var child = Object.create(parent); 
child.xChange(); 
child.yChange(); 

console.log(child.x, child.y); // 1 [1] 
console.log(parent.x, parent.y); // [] 
+1

如果有人希望能够做'parent.yChange',那么条件应该由'this!== parent && ...' –

+0

扩展好点,编辑 –

+0

我想我只需要使用一个构造函数。谢谢@JpajiRajnish。 –

5

然而,继承的方法yChange()改变原型阵列和未继承的阵列。

“继承”数组和“原型”数组没有区别。他们是一样的。

你必须给child自己的数组:

var child = Object.create(parent); 
child.y = []; 

所以,我不能承受的 '自己' 的阵列与多少?问题是如何用继承的数组来完成它。

所有被继承的东西都不是由孩子“拥有”的。偶数。区别在于数字不可变,因此这个问题并不明显。

仔细一看什么位置:

this.x += 1 

您是分配一个新值this.x。这将创建child.x,而不是修改parent.x

让我们看看

this.y.push(1); 

您是这里指定任何东西。你是阅读this.y,它解析为parent.y,你是突变数组对象本身。

现在更清楚为什么你必须指定一个新的数组child.ychild.y = [];)?这项任务给了孩子自己的数据副本。

的数目和阵列的情况下之间的区别是,数字是不可改变和阵列可变。号码的不变性强制你创建一个新号码并且分配它。

不是那么可变的值。如果您不希望共享该值,则必须明确创建该值的副本(这就是child.y = [];基本上正在执行的操作)。

+0

因此,我不能像数字一样继承“自己的”数组吗?问题是如何用继承的数组来完成它。 –

+1

*所有继承的**都不是由**孩子“拥有”。偶数。不同之处在于数字是*不可变的,因此这个问题并不明显。 –

+0

你可能想再次阅读链接的问题,我觉得你还没有真正理解*为什么*(哈,我回答了一个......有趣的,也许我没有做这么好的工作)。 –