什么时候需要使用Object.assign()方法来复制对象的实例?

时间:2016-04-19 21:39:01

标签: javascript jquery object constructor

以下是我自己练习此问题的示例方案。如果您想直接跳到技术细节,请参阅'技术细节'以下

我有一个个人项目,我一直在努力学习JavaScript。基本上,用户可以通过选择可用选项来设计鞋子。

诀窍是左右鞋必须具有相同的尺寸,以及其他属性,但颜色,鞋带纹理等等可以是每个鞋子的独立属性。 (我认为这对我来说是一种体面的方式来练习对象操作和继承)。

用户开始设计合适的鞋子;当"交换"单击按钮查看左侧鞋子,用户当前看到右侧鞋子的副本(但是倒置)。 只有在第一次更换鞋子时才生成左鞋,并制作了正确鞋子的精确副本。从那时起,保留了每个鞋子方向的独特选项。然后,如果用户对那个左脚鞋模型进行了特定更改,然后切换到右鞋,那么用户应该是在他们点击" swap"之前看到他们最初设计的完全相同的右鞋。按钮。

因此,如果他们的右鞋有红色鞋带,他们会切换到左侧鞋子视图并使左侧鞋子有蓝色花边,然后当切换回右侧鞋子时,用户应该看到红色鞋带!

技术细节

当我为我的主项目编写代码时,遇到了独特的选项,我遇到了麻烦。例如,如果我为左鞋制作鞋带绿色,那么右鞋总是会有绿色鞋带。对问题进行故障排除很容易,因为正确的鞋子失去它的唯一选择,例如红色蕾丝,就是我为左鞋设置蕾丝颜色的时候。

console.log("THE RIGHT LACE BEFORE: " + rightShoe.laceId);
leftShoe.laceId = 'green';
console.log("THE RIGHT LACE AFTER: " + rightShoe.laceId);

登录控制台的内容是:

  

之前的正确蕾丝:红色

     

正确的蕾丝后:绿色

即使我没有更改rightShoe,每当我更改leftShoe属性时,它都会被更改。

所以我回到了我第一次定义leftShoe对象的位置,这是用户点击" swap"这是脚本生命中的第一次(我的业余思想是为什么传播和填充leftShoe对象,如果用户可能永远不会定制左鞋?也许它正在存在对数据不必要的吝啬,我不知道)。从那时起,我从未将leftShoe重新定义为rightShoe 的副本,反之亦然。我想我可能正在进行对象引用这一事实让我感到困惑,就像其他语言一样,我正在更改引用而不是值。

在遇到麻烦之前,我想制作一个JSFiddle来重现问题。由于我的项目很长(约1500行,包括一些 THREE.js 的图形),我尽力模仿这个过程。所以here it is

除了JSFiddle完全按照我的预期工作!左模型保留了它对该属性的唯一属性和数据集。所以,我做了一些挖掘和阅读 Object.assign()方法。所以在我原来的项目代码中(不是小提琴),我改变了这个:

leftShoe = rightShoe;

到此:

leftShoe = Object.assign({}, rightShoe);

我很高兴终于让这个工作起来,我同样感到好笑和困惑,因为我不明白为什么我的JSFiddle不需要assign()方法但是我的同一个项目代码做了。谢谢。

1 个答案:

答案 0 :(得分:12)

Object.Assign为左侧鞋子制作一个新的COPY,包括所有可枚举的OWN属性。当你使用leftshoe = rightshoe时,你正在对左鞋进行参考。引用指向同一个对象,而不是新复制。因此,如您所述,更改引用的属性实际上正在更改原始属性。