Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象作为默认值分配给变量并被覆盖,但未按预期工作_Javascript_Object_Reference_Cloning - Fatal编程技术网

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;