数组中奇怪的JavaScript对象赋值

时间:2012-09-22 18:44:14

标签: javascript javascript-objects

我在使用JavaScript将对象分配给数组时遇到了一个奇怪的问题,这是完整的代码

var co = {'yAxis':10};

var dynCharts = new Array();

for (var x=0; x<2; x++){                  
    dynCharts[x] = co;   
}
//assigning to first array only 
dynCharts[0].yAxis = { 'a':'1'};
//now alert second array
alert(dynCharts[1].yAxis.a);

如果您上面的示例代码首先我有一个名为co的对象,那么我将该对象分配给数组。现在我想更改第一个数组的名为yAxis的属性,但它也改变了第二个数组的yAxis对象的值。

这段代码的JSfiddle在这里:http://jsfiddle.net/qvKaZ/

有人可以帮助我,为什么它会如何以财产方式进行?

3 个答案:

答案 0 :(得分:1)

您的阵列的所有单元格中都有相同的对象(即同一个实例)。

您需要复制(克隆)co,以便一个更改不适用于所有单元格:

for (var x=0; x<2; x++){                  
    dynCharts[x] = {yAxis:co.yAxis}; // this puts in dynCharts[x] a copy of co
}

答案 1 :(得分:0)

数组中的每个对象都是对象的引用。如果您根本更改了对象,则阵列中的所有值都将显示为已更新。您需要在循环的每次迭代中创建一个新对象或克隆现有对象。

答案 2 :(得分:0)

一种方法是使用Object.create,这将创建一个继承自co的新对象。

for (var x=0; x<2; x++){                  
    dynCharts[x] = Object.create(co);   
}

一个优点是您可以随时更新co,并且只要更新的属性未在实际对象上进行遮蔽,所有从其继承的对象都将看到更新。

要处理旧浏览器,请包含此代码。

if (!Object.create) {
   Object.create = function(proto) {
       Object.create.F.prototype = proto;
       return new Object.create.F;
   };
   Object.create.F = function(){};
}

它不是完全合规的替代品,但适用于上面使用的基本案例