我正在经历一些非常奇怪的对象行为。 我有这个模板对象:
template: {
trigger: {
width: 32,
height: 32,
delay: 0
},
player: {
direction: {
value: "right",
options: "left|right"
}
},
apple: {
direction: {
value: "down",
options: "up|down|left|right"
}
}
},
是名为layers
的对象的对象。
在layers
对象的函数内部,我将新数据(实体)添加到空entities
对象。
if (!this.entities[which])
{ this.entities[which] = []; }
if (!this.entities[which][id])
{ this.entities[which][id] = {}; }
this.entities[which][id].pos = "0,0";
this.entities[which][id].variables = {};
this.entities[which][id].variables = this.template[which];
稍后当我尝试更改this.entities[which][id].variables.width
时,拥有which
相同模板的每个权限都会获得相同的属性以及不会更改的模板对象尽管代码中的任何地方。我调试了几乎所有内容并完成了代码的每一部分。权利身份也是独一无二的。
对象变更的部分如下所示:
input.setAttribute("onkeyup", "layers.entities['" + i + "'][" + j + "].variables['" + jj + "'] = this.value; layers.updateEntities();");
其中i是权利的名称,j是id,jj是选项名称。
你可以在这里试试自己: [除去]
切换到实体图层,添加两个触发器,拖动一个,右键单击它并更改其中一个属性。虽然他们有不同的身份,但两者都会改变。新的也会有这些属性。
因为模板本身已经改变了,我想,这个this.entities[which][id].variables = this.template[which];
以某种方式将这两个对象链接在一起而不是给左手变量分配“副本”。我从来没有听说过这样的事情。
答案 0 :(得分:1)
Javascript中的对象通过引用传递,因此您怀疑问题是每个人共享同一组变量:
var a = {x:1};
var b = a;
b.x = 2;
console.log(a.x); //gives 2
有许多方法可以修复你的代码,但一个非常简单的方法就是让模板成为“构造函数”而不是直接返回对象
template: {
trigger: function(){
//now we return a brand new object each time.
return {
width: 32,
height: 32,
delay: 0
};
},
player: function(){ /*...*/},
apple: function(){ /*...*/}
}
//...
this.entities[which][id].variables = this.template[which]();
//^^^