2009-07-09 14 views
2

Ich habe den folgenden JavaScript-Code:JavaScript Objektliteral und Array

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

Nun dies schafft die folgende Struktur (ein Array von drei Objekten).

Array[Object, Object, Object]; 

Wenn ich jedoch versuche, auf die Eigenschaften jedes Objekts zuzugreifen, kommen alle gleich heraus. Warum ist das?

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

Was mache ich falsch?

Antwort

12

Sie verwenden den gleichen oCoord für alle Ihre Koordinatenobjekte.

Versuchen Sie stattdessen:

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

Snap! Beat mich dazu. –

+0

danke, perfekt. Richtige Antwort für die erste vollständige korrekte Erklärung gegeben – 32423hjh32423

3

Sie verwenden den gleichen Verweis auf Ihr Objekt. Sie müssen jedes Mal ein neues erstellen.

z.

var aStack = []; 

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

Oder, wenn Sie den Stil, den Sie schrieb es vorziehen, in, tun:

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

Hinweis wir mit var jedes Mal erstellen eine neue Instanz erneut erklärt werden.

+3

Afaik Sie können nicht "re-declare" Variablen in JS, die 'var' Teil wird gerade und diese Antwort ignoriert würde ohne die zusätzlichen 'var's funktionieren (dh nur o = {}). – cic

+2

cic ist richtig, Sie deklarieren nicht jedes Mal eine neue Variable, stattdessen verwenden Sie die gleiche Variable o überall, aber weisen ihr einen neuen Wert zu. –

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

Sie sind die Werte von x und y in oCord überschrieben werden. So

, wenn Sie sagen

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

es den vorherigen Wert überschreibt.

1

Egil Hansen's answer ist wahrscheinlich besser, aber man konnte clone the object als alternative Lösung:

// 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] 
Verwandte Themen