如何使用继承方法更改继承的数组?

Dav*_*iss 0 javascript arrays inheritance

我想有一个继承数组属性的对象和一个向继承数组添加元素的方法.但是,继承的方法yChange()更改了原型数组而不是继承的数组.这个问题解释了为什么会发生不良行为.但无法弄清楚如何获得理想的行为.

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]
Run Code Online (Sandbox Code Playgroud)

期望:

console.log(child.x, child.y); // 1 [1]
console.log(parent.x, parent.y); // 0 []
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 5

但是,继承的方法yChange()会更改原型数组而不是继承的数组.

"继承"数组和"原型"数组之间没有区别.他们是一样的.

你必须给child自己的数组:

var child = Object.create(parent);
child.y = [];
Run Code Online (Sandbox Code Playgroud)

那么,我不能像数字那样继承一个'自己的'数组?问题是如何使用继承的数组来完成它.

遗传的一切都不是由孩子"拥有"的.偶数.不同之处在于数字不可变,因此问题不明显.

仔细看看这里:

this.x += 1
Run Code Online (Sandbox Code Playgroud)

您正在为其分配新值this.x.这将创建child.x,而不是修改parent.x.

让我们来看看

this.y.push(1);
Run Code Online (Sandbox Code Playgroud)

没有在这里分配任何东西.您正在阅读 this.y,它解析为parent.y您正在改变数组对象本身.

现在更清楚为什么你必须为()分配一个新数组?赋值是为孩子提供自己的数据副本. child.ychild.y = [];

数字和数组之间的区别在于数字是不可变的,数组是可变的.数字的不变性迫使您创建一个新数字并分配它.

可变值不是这样.如果您不希望共享该值,那么您必须显式创建该值的副本(这 child.y = [];就是基本上正在做的事情).