2009-07-09 7 views
2

J'ai le code JavaScript suivant:JavaScript littéral d'objet et tableau

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

Maintenant, cela crée la structure suivante (un tableau de trois objets). Cependant, lorsque j'essaie d'accéder aux propriétés de chaque objet, elles ressortent toutes identiques. Pourquoi est-ce?

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

Qu'est-ce que je fais mal?

Répondre

12

Vous utilisez le même oCoord pour tous vos objets de coordonnées.

Essayez ceci:

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

Snap! Battez-moi. –

+0

merci, parfait. Réponse correcte donnée pour la première explication correcte complète – 32423hjh32423

3

Vous utilisez la même référence à votre objet. Vous devez en créer un nouveau à chaque fois.

E.g.

var aStack = []; 

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

Ou, si vous préférez le style que vous avez écrit dans, faites:

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

Notez que nous re-proclamons avec var chaque fois de créer une nouvelle instance.

+3

AFAIK vous ne pouvez pas les variables "re-déclarer" à JS, la partie 'de var' seront simplement ignorées et cette réponse fonctionnerait sans les 'var's supplémentaires (ie o = {} seulement). – cic

+2

cic est correct, vous ne déclarez pas une nouvelle variable à chaque fois, mais vous utilisez la même variable o partout, mais vous lui attribuez une nouvelle valeur. –

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

Vous écrasez les valeurs de x et y dans oCord.

Alors, quand vous dites

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

elle écrasera la valeur précédente.

1

Egil Hansen's answer est probablement mieux, mais vous pourriez clone the object comme une solution alternative:

// 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] 
Questions connexes