花了一段时间才完全了解数组在对象中的工作方式。我熟悉其他语言,但是这给我造成了很多困惑。 有物体
var Test = {
TestArray: [],
}
var a = Object.create(Test);
var b = Object.create(Test);
根据我的期望,这应该创建该对象的2个实例,并具有2个不同的数组,但是内部具有一个数组的行为就像1个实例,向该数组添加值会影响这两个实例,有人可以解释为什么吗?
答案 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());