我可以有两个具有相同属性名称的对象吗?

时间:2015-12-30 21:18:17

标签: javascript html

每当我尝试更改数组y中的第一个对象时,我的数组中的所有其他对象y属性也会发生变化,是否有任何方法可以防止这种情况,或者将多个对象添加到共享相同对象的数组中物业? 我一直在尝试一切来解决这个问题(我正在创建一个游戏,使用类似的阵列进行子弹射击,每当我更改数组中第一个项目的y属性时,数组中所有其他y属性都随之改变)和我认为这可能是问题?

parseMembersFromArray

4 个答案:

答案 0 :(得分:2)

您可以通过在.push()中定义一个对象来解决此问题。

这为数组的每个元素创建一个新对象,而不是包含对同一对象的多个引用的数组。

var arr = [];
for(var i = 0;i<3;i++) {
arr.push({x:30, y:20});
}
arr[0].y = 40;
document.write(arr[0].y + " " + arr[1].y);

答案 1 :(得分:0)

你正在制作一个obj并在数组中传递对同一个对象的引用4次

相反,您可以尝试在每次迭代中创建新对象:

var arr = [];
for(var i = 0;i<3;i++) {
  arr.push({x:30,y:20});
}
arr[0].y = 40;
document.write(arr[0].y + " " + arr[1].y);

您还可以查找各种方法来克隆&#34;一个东西。 angular,jquery和underscore都提供了这样做的方法,或者你可以查看How to clone js object?

答案 2 :(得分:0)

除了@IrkenInvader给出的答案,您还可以使用对象的jQuery to very easily perform a deep-copy

var obj = {x: 30, y: 20};
var arr = [];
for(var i  = 0; i < 3; i++) {
  arr.push(jQuery.extend(true, {}, obj));
}

arr[0].y = 40;
document.write(arr[0].y + " " + arr[1].y);

答案 3 :(得分:0)

在JavaScript中,对象作为指向对象内部值的指针存储在内存中。这与原始数据类型(intchar等)

的方式不同

显示此功能的一个好方法是尝试打印出对象,然后打印出int

HTML:

<div id="anelementhere"></div>
<div id="anotherelementhere"></div>

<强> JS:

var x = 5;
var obj = {x:30,y:20};
document.getElementById("anelementhere").innerHTML = x;
document.getElementById("anotherelementhere").innerHTML = obj;

JSFiddle:https://jsfiddle.net/d3ohpqqp/

您应该能够看到类似于:

的内容
5
[object Object]

现在,知道这一点,数组中存储的内容不是{{x:30, y:20}, {x:30, y:20}, {x:30, y:20}},而是{[object Object], [object Object], [object Object]},它们都指向 ONE {x:30, y:20}

这是更改后所有y属性发生变化的原因。现在这是一个简单的解决方案,正如@IrkenVader所示,当您将对象放入阵列时,可以初始化对象。

 但是,如果由于某种原因你仍然想要在数组之外的原始对象,这是另一种解决方案:

var obj = {x:30,y:20};
var arr = [];
for(var i = 0;i<3;i++) {
    arr.push({x:obj.x, y:obj.y});
}
arr[0].y = 40;
document.write(arr[0].y + " " + arr[1].y);

JSFiddle:https://jsfiddle.net/9gzyr38x/