我在使用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/
有人可以帮助我,为什么它会如何以财产方式进行?
答案 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(){};
}
它不是完全合规的替代品,但适用于上面使用的基本案例