我希望有一个继承数组属性的对象和一个向继承数组添加元素的方法。但是,继承的方法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 :(得分:5)
但是,继承的方法yChange()会更改原型数组而不是继承的数组。
"继承&#34>之间没有区别。数组和"原型"阵列。他们是同一个。
您必须为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.y
(child.y = [];
),这是否更清晰?赋值是为孩子提供自己的数据副本。
数字与数组的区别在于数字不可变且数组可变。数字的不变性强制您创建一个新数字并分配它。
可变值不是这样。如果您不希望共享该值,那么您必须明确创建该值的副本(以及child.y = [];
基本上正在做的事情。)
答案 1 :(得分:1)
菲利克斯对于改变孩子所必需的任务是正确的。在您的示例中,您可以先检查内存地址是否相同,然后在新实例匹配时为其分配新内存地址。像这样:
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); // []