对象单个实例中的JS作为数组属性

时间:2018-11-21 20:18:32

标签: javascript arrays

花了一段时间才完全了解数组在对象中的工作方式。我熟悉其他语言,但是这给我造成了很多困惑。 有物体

var Test = {
    TestArray: [],
}
var a = Object.create(Test);
var b = Object.create(Test);

根据我的期望,这应该创建该对象的2个实例,并具有2个不同的数组,但是内部具有一个数组的行为就像1个实例,向该数组添加值会影响这两个实例,有人可以解释为什么吗?

2 个答案:

答案 0 :(得分:3)

您是对的,Object.create正在创建一个新对象,但是每当您将一个对象传递给它时,它将使该对象成为它的原型。

意思是,如果该原型对象作为数组,则将共享相同的实例。

请查看MDN中给出的示例,他们调用的函数在原型上,因此只有一个实例。

为了获得您的请求,可以使用ES6类语法:

class Test {
  constructor() {
    this.TestArray = [];
  }
}

const t1 = new Test();
const t2 = new Test();

t1.TestArray.push('item1');
console.log(t1.TestArray);
console.log(t2.TestArray); // Should print an empty array

答案 1 :(得分:2)

您对2 instances of the object的看法是正确的,但是在它们内部具有相同的数组引用,因此在一个位置进行更改会在另一个位置进行更改。

var Test = {
    TestArray: [],
}

var a = Object.create(Test);
var b = Object.create(Test);

a === b // false
a.TestArray === a.TestArray // true

有很多方法可以避免此问题。以下是为了保留Object.create

的选项
var getTest = () => ({
    TestArray: [],
});

var a = Object.create(getTest());
var b = Object.create(getTest());