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

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

本文关键字:方法 复制 对象 实例 Object assign 何时需      更新时间:2023-09-26

下面是我为自己实践这个问题而编写的一个示例场景。如果您想直接跳到技术细节,请参阅下面的"技术细节"

我有一个学习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完全按照我的预期工作bject.assign()方法。因此,在我最初的项目代码中(而不是小提琴),我更改了这个:

leftShoe = rightShoe;

到此:

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

虽然我很兴奋终于实现了这一点,但我也同样感到好笑和困惑,因为我不明白为什么我的JSFiddle不需要assign()方法,而我的相同项目代码需要。非常感谢。

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