2012-09-22 63 views
1

我有一個奇怪的問題,而在這裏的JavaScript分配對象數組是完整的代碼陣奇怪的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); 

如果上面的示例代碼,首先我有一個對象調用合作則我將該對象分配給數組。現在我想改變第一個數組的yAxis屬性,但它也改變了第二個數組的yAxis對象的值。

這段代碼的jsfiddle是在這裏:http://jsfiddle.net/qvKaZ/

有人可以幫我爲什麼事情發生怎麼辦呢財產呢?

回答

1

在陣列的所有單元中有相同的對象(即相同的實例)。

你需要複製(克隆)合作,這樣一個變化並不適用於所有的細胞:

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

好,謝謝回答quickly..I've作爲用於基本的情況下,將工作想通了發佈這個問題後:) ...我現在更新了jsfiddle並使用jQuery函數來克隆對象 - http://jsfiddle.net/qvKaZ/3/ – roshanbh

0

每個對象陣列中是對對象的引用。如果完全改變對象,則數組中的所有值都將顯示爲已更新。您需要在循環的每次迭代中創建一個新對象或克隆現有對象。

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(){}; 
} 

這不是一個完全兼容的替代品,但高於