2009-07-09 7 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); 

さて、これは、以下の構造(3つのオブジェクトの配列)を作成します。

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}); 
+0

スナップ!それに私を打つ。ありがとう、完璧です。 –

+0

最初の完全な正しい説明のための正しい答え – 32423hjh32423

3

あなたのオブジェクトと同じ参照を使用しています。毎回新しいものを作成する必要があります。

など。

あなたは、あなたがそれを書いたスタイルを好む場合
var aStack = []; 

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

または、ん:私たちは、新しいインスタンスを作成するためにvarたびに再宣言している

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); 

注意。

+3

、 'var'部分は単に無視され、この答え余分な 'var's(すなわちo = {}のみ)なしで動作します。 – cic

+2

cicが正しい場合は、毎回新しい変数を宣言するのではなく、代わりに同じ変数を使用していますが、新しいvalusを割り当てています。 –

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ことができ、おそらくより良いですが、:あなたはJSで「再宣言」の変数はできません私の知る限り

// 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] 
関連する問題