繁体   English   中英

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

[英]When is it necessary to use the Object.assign() method to copy an instance of an object?

以下是我自己练习此问题的示例场景。 如果您想直接跳到技术细节,请参阅下面的“技术细节”。

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

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

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

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


技术细节

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

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

记录到控制台的是:

之前的正确的蕾丝:红色

正确的蕾丝后:绿色

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

所以我回到了我第一次定义leftShoe对象的地方,这是用户在脚本生命周期中第一次点击“交换”的时候(我的业余想法是为什么传播并填充leftShoe对象,如果用户可能永远不会定制的话)左边的鞋子?也许是对数据不必要的吝啬,我不知道)。 从那时起, 我从来没有重新定义了leftShoe是副本rightShoe反之亦然。 我认为我可能因为我可能正在进行对象引用而被挂起,就像其他语言一样,我正在改变引用而不是值。

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

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

leftShoe = rightShoe;

对此:

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

我很高兴终于让它工作了,我同样感到好笑和困惑,因为我不明白为什么我的JSFiddle不需要assign()方法但我的相同项目代码确实如此。 谢谢。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM