I have the following JavaScript code:
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);
Now this creates the following structure (an array of three objects).
Array[Object, Object, Object];
However, when I try and access the properties of each object they are all ing out the same. Why is this?
alert(aStack[0].x); // Outputs 716
alert(aStack[1].x); // Outputs 716
alert(aStack[2].x); // Outputs 716
What am I doing wrong?
I have the following JavaScript code:
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);
Now this creates the following structure (an array of three objects).
Array[Object, Object, Object];
However, when I try and access the properties of each object they are all ing out the same. Why is this?
alert(aStack[0].x); // Outputs 716
alert(aStack[1].x); // Outputs 716
alert(aStack[2].x); // Outputs 716
What am I doing wrong?
Share Improve this question edited Jun 26, 2016 at 11:48 Peter Mortensen 31.6k22 gold badges110 silver badges133 bronze badges asked Jul 9, 2009 at 9:04 32423hjh3242332423hjh32423 3,0887 gold badges46 silver badges62 bronze badges5 Answers
Reset to default 12You are using the same oCoord for all your coordinates objects.
Try this instead:
var aStack = [];
aStack.push( { x: 726, y: 52} );
aStack.push( { x: 532, y: 76} );
aStack.push( { x: 716, y: 529} );
You are using the same reference to your object. You need to create a new one each time.
E.g.
var aStack = [];
aStack.push( { x: 2, y: 23 });
aStack.push( { x: 3, y: 4 });
aStack.push( { x: 33, y: 2 });
Or, if you prefer the style you wrote it in, do:
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 );
Note we are re-declaring with var
each time to create a new instance.
var aStack = [];
aStack.push({ x: 726; y: 52 });
aStack.push({ x: 76; y: 532 });
aStack.push({ x: 716; y: 529 });
Egil Hansen's answer is probably better, but you could clone the object as an alternative solution:
// 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]
You are overwriting the values of x and y in oCord.
So when you say
oCoord.x = 716;
oCoord.y = 529;
it overwrites the previous value.