Javascript 对象作为默认值分配给变量并被覆盖,但未按预期工作
嘿,很抱歉标题太长了,但我想不出更好的描述。 问题是:我在游戏中定义了一些宇宙飞船,为此我创建了一个包含所有数据屏蔽的简单表,等等:Javascript 对象作为默认值分配给变量并被覆盖,但未按预期工作,javascript,object,reference,cloning,Javascript,Object,Reference,Cloning,嘿,很抱歉标题太长了,但我想不出更好的描述。 问题是:我在游戏中定义了一些宇宙飞船,为此我创建了一个包含所有数据屏蔽的简单表,等等: var defaultShipDataSheet = [ ['Shields', DISPLAY_HANGAR, DISPLAY_HUD, { id: 0, core: 100, base: 100, mod: 100 }], ['Armor', DISPLAY_HANGAR, DISPLAY_H
var defaultShipDataSheet = [
['Shields', DISPLAY_HANGAR, DISPLAY_HUD, { id: 0, core: 100, base: 100, mod: 100 }],
['Armor', DISPLAY_HANGAR, DISPLAY_HUD, { id: 1, core: 100, base: 100, mod: 100 }],
['Toughness', NO_DISPLAY_HANGAR, NO_DISPLAY_HUD, { id: 2, core: 100, base: 100, mod: 100 }],
['Speed', DISPLAY_HANGAR, DISPLAY_HUD, { id: 3, core: 100, base: 100, mod: 100 }],
['Weight', DISPLAY_HANGAR, DISPLAY_HUD, { id: 4, core: 100, base: 100, mod: 100 }],
['Agility', DISPLAY_HANGAR, NO_DISPLAY_HUD, { id: 5, core: 100, base: 100, mod: 100 }],
['Area Damage', DISPLAY_HANGAR, NO_DISPLAY_HUD, { id: 6, core: 100, base: 100, mod: 100 }],
['Life On Hit', DISPLAY_HANGAR, NO_DISPLAY_HUD, { id: 7, core: 100, base: 100, mod: 100 }],
['Life On Kill', DISPLAY_HANGAR, NO_DISPLAY_HUD, { id: 8, core: 100, base: 100, mod: 100 }],
['Firing Rate', DISPLAY_HANGAR, NO_DISPLAY_HUD, { id: 9, core: 100, base: 100, mod: 100 }],
['Beam Charging Time', DISPLAY_HANGAR, NO_DISPLAY_HUD, { id: 10, core: 100, base: 100, mod: 100 }],
['Bomb Capacity', DISPLAY_HANGAR, DISPLAY_HUD, { id: 11, core: 100, base: 100, mod: 100 }],
['Critical Hit Chance', DISPLAY_HANGAR, NO_DISPLAY_HUD, { id: 12, core: 100, base: 100, mod: 100 }],
['Critical Damage', DISPLAY_HANGAR, NO_DISPLAY_HUD, { id: 13, core: 100, base: 100, mod: 100 }],
['Damage', DISPLAY_HANGAR, NO_DISPLAY_HUD, { id: 14, core: 100, base: 100, mod: 100 }],
];
在我创建一个没有标签和显示选项的简化版本后:
var defaultShipData = {};
for (var m=0; m <= defaultShipDataSheet.length-1; m++) {
propertyName = defaultShipDataSheet[m][0].substr(0, 1).toLowerCase() + defaultShipDataSheet[m][0].substr(1);
propertyName = propertyName.replace(/ /g, "");
defaultShipData[propertyName] = defaultShipDataSheet[m][3];
}
然后我覆盖了定制船舶的值:
/* Industrial Posterites */
allShips[1].shipData.shields.core = 20;
然后将其分配给船舶的整个范围和defaultShipData对象。
以下是defaultShipData对象的捕获:
我想这是因为它都是通过引用传递的,但是我怎么能避免呢
我已经研究了克隆方法,但我不确定这是否是正确的方法。是的,您需要克隆defaultShipData。否则,所有的飞船都会引用同一个对象。你是对的,这是因为在那里只有一个对象。唯一的方法是克隆对象。参考:您还需要执行深度复制。感谢您的回答。在我检查正确答案之前,你能给我一个关于我是如何设置的意见吗?这是一个好的方法吗?谢谢
/* Industrial Posterites */
allShips[1].shipData.shields.core = 20;