javascript为什么两个不同的对象引用/使用相同的数组?
我有一个对象定义,其中有一个数组。当我实例化2个对象并访问其成员时,两个对象都写入同一个数组。我希望每个对象都有自己的数组,而不是共享同一个数组。对于对象的其他成员,它可以正常工作。这是为什么?正确的做法是什么?下面是一个示例代码javascript为什么两个不同的对象引用/使用相同的数组?,javascript,arrays,object,members,Javascript,Arrays,Object,Members,我有一个对象定义,其中有一个数组。当我实例化2个对象并访问其成员时,两个对象都写入同一个数组。我希望每个对象都有自己的数组,而不是共享同一个数组。对于对象的其他成员,它可以正常工作。这是为什么?正确的做法是什么?下面是一个示例代码 //define simple object var OBJ = { id: 0, arr: [0,0] }; //instantiate objects let obj1 = Object.create(OBJ); let obj2 = Object.cr
//define simple object
var OBJ = {
id: 0,
arr: [0,0]
};
//instantiate objects
let obj1 = Object.create(OBJ);
let obj2 = Object.create(OBJ);
//change members value
obj1.id = 1;
obj1.arr[0]=1111;
obj2.id=2;
obj2.arr[1]=2222;
//verify changes
console.log(obj1.id); //id = 1 as expected
console.log(obj1.arr); //<--- expected [1111, 0000] NOT [1111, 2222]
console.log(obj2.id); //id = 2 as expected
console.log(obj2.arr); //<--- expected [0000, 2222] NOT [1111, 2222]
应该是您想要的,它将递归地复制所有内容
使用从OBJ创建新对象时,OBJ将成为新对象的原型。所有方法和属性都取自,除非对象通过使用其自己的同名属性来覆盖它们。由于arr是OBJ的一个属性,因此所有对象都会更新并显示相同的数组
建议的解决方案
您可以将arr转换为将检查arr是否为当前对象的属性的数组,如果不是,则克隆原型数组,然后返回它
//定义简单对象
var OBJ={
id:0,
_arr:[0,0],
获得arr{
如果!this.hasOwnProperty“u arr”this.\u arr=[…this.\u arr];
把这个还给我;
}
};
//实例化对象
设obj1=Object.createOBJ;
设obj2=Object.createOBJ;
//更改成员值
obj1.id=1;
obj1.arr[0]=1111;
obj2.id=2;
obj2.arr[1]=2222;
//验证更改
console.logobj1.id//id=1,如预期
console.logobj1.arr// 您试图实现的目标可以通过以下方式实现:
function OBJ() {
this.id = 0;
this.arr = [0,0];
}
let obj1 = new OBJ();
let obj2 = new OBJ();
因为它为每个新创建的对象创建一个单独的实例,即每个新创建的对象都有自己的id和arr副本
您的方法适用于基本数据类型,但不适用于数组等非基本数据类型。您正在原型上实例化一个数组,但没有意识到对该数组的修改将对所有实例进行修改
obj1和obj2最初参考了OBJ原型的相同id和arr
只有当obj1.id/obj2.id发生更改时,obj1/obj2才有自己的新id副本,否则它们引用的是OBJ原型的相同id
现在,这种行为只适用于基本类型。
对于非基元类型,即数组,obj1和obj2始终引用OBJ原型的同一arr。引用非基元的任何变量(如对象或数组)本质上都引用对象所在的内存位置。obj2=obj只是给obj2一个对同一内存位置的引用。@CertainPerformance-对不起,先生,您的解释无意中提到了原因,但这并不是发生这种情况的原因。@CertainPerformance说得通。苏欧,有什么办法?不要在对象中使用数组?@Geo-我的答案中有修复方法。@Geo我记得它叫“按引用传递”,你可以用谷歌搜索它。如果要创建绝对独立的对象,请克隆它。