Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript为什么两个不同的对象引用/使用相同的数组?_Javascript_Arrays_Object_Members - Fatal编程技术网

javascript为什么两个不同的对象引用/使用相同的数组?

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

我有一个对象定义,其中有一个数组。当我实例化2个对象并访问其成员时,两个对象都写入同一个数组。我希望每个对象都有自己的数组,而不是共享同一个数组。对于对象的其他成员,它可以正常工作。这是为什么?正确的做法是什么?下面是一个示例代码

//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我记得它叫“按引用传递”,你可以用谷歌搜索它。如果要创建绝对独立的对象,请克隆它。