2009-07-09 61 views
2

我有以下的JavaScript代碼:JavaScript對象文字和陣列

oCoord = {x: null, y: null}; 
var aStack = []; 

oCoord.x = 726; 
oCoord.y = 52; 
aStack.push(oCoord); 

oCoord.x = 76; 
oCoord.y = 532; 
aStack.push(oCoord); 

oCoord.x = 716; 
oCoord.y = 529; 
aStack.push(oCoord); 

現在這產生下述結構(三個對象的陣列)。

Array[Object, Object, Object]; 

但是,當我嘗試訪問每個對象的屬性時,它們都出來了。爲什麼是這樣?

alert(aStack[0].x); // Outputs 716 
alert(aStack[1].x); // Outputs 716 
alert(aStack[2].x); // Outputs 716 

我在做什麼錯?

回答

12

對所有座標對象使用相同的oCoord。

試試這個:

var aStack = []; 
aStack.push({ x: 726, y: 52}); 
aStack.push({ x: 532, y: 76}); 
aStack.push({ x: 716, y: 529}); 
3

您正在使用與您的對象相同的參考。您需要每次創建一個新的。

例如

var aStack = []; 

aStack.push({ x: 2, y: 23 }); 
aStack.push({ x: 3, y: 4 }); 
aStack.push({ x: 33, y: 2 }); 

或者,如果你願意,你寫的風格,這樣做:

var aStack = []; 

var o = {}; 
o.x=1; 
o.y=3; 
aStack.push(o); 

var o = {}; 
o.x=21; 
o.y=32; 
aStack.push(o); 

var o = {}; 
o.x=14; 
o.y=43; 
aStack.push(o); 


alert(aStack[0].x); 
alert(aStack[1].x); 
alert(aStack[2].x); 

注意,每次var我們正在重新申報創建一個新的實例。

+3

AFAIK你不能在JS「重新申報」變量,則`var`部分將只是被忽略,這個答案會在沒有額外的`var`s的情況下工作(即只有o = {})。 – cic 2009-07-09 09:30:46

+2

cic是正確的,你不是每次都聲明一個新的變量,而是你在任何地方都使用相同的變量o,但是給它賦值新的值。 – 2009-07-09 09:58:46

1
var aStack = []; 
aStack.push({ x: 726; y: 52 }); 
aStack.push({ x: 76; y: 532 }); 
aStack.push({ x: 716; y: 529 }); 
1

您將要覆蓋在oCord x和y的值。

所以,當你說

oCoord.x = 716; 
oCoord.y = 529; 

覆蓋舊的值。

1

Egil Hansen's answer可能是更好的,但你可以clone the object作爲一種替代方案:

// Some function to clone objects (e.g. using jQuery) 
function clone(o) { return $.extend(true, {}, o); } 

oCoord = { x: null, y: null }; 
var aStack = []; 

oCoord.x = 726; 
oCoord.y = 52; 
aStack.push(clone(oCoord)); 

oCoord.x = 76; 
oCoord.y = 532; 
aStack.push(clone(oCoord)); 

oCoord.x = 716; 
oCoord.y = 529; 
aStack.push(clone(oCoord)); 

// console.log(aStack) => 
// [Object x=726 y=52, Object x=76 y=532, Object x=716 y=529]