1

我在 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/

有人可以帮助我为什么它会以财产方式发生吗?

4

3 回答 3

1

在数组的所有单元格中都有相同的对象(即相同的实例)。

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

for (var x=0; x<2; x++){                  
    dynCharts[x] = {yAxis:co.yAxis}; // this puts in dynCharts[x] a copy of co
}
于 2012-09-22T18:47:19.883 回答
0

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

于 2012-09-22T18:48:46.063 回答
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(){};
}

它不是完全合规的替代品,但适用于上述基本情况

于 2012-09-22T18:57:29.377 回答