我有一个个人项目,我一直在努力学习JavaScript.基本上,用户可以通过选择可用的选项来设计鞋子.
诀窍在于,左右鞋必须具有相同的尺寸以及其他属性,但是诸如颜色,鞋带纹理等的东西可以是每个鞋独立的属性. (我认为这对我来说是一种体面的方法来实践对象的操纵和继承).
用户开始设计合适的鞋子;当单击“交换”按钮以查看左鞋时,用户当前看到右鞋的副本(但是反转).只有在鞋子的第一次交换中,左鞋产生并制作了正确的鞋子的精确副本.从此,保留了每个鞋子方向的独特选项.然后,如果用户对该左鞋型号进行了特定的更改,然后切换到右鞋,则用户应该在点击“交换”按钮之前看到他们原来设计的完全相同的右鞋.
所以如果他们的右鞋子有红色的鞋带,他们会转向左边的鞋子,让左边的鞋子有一个蓝色的花边,然后当切换回右鞋时,用户应该看到红色鞋带!
技术细节
当我编写我的主要项目的代码时,我遇到困难,独特的选择是坚持的.例如,如果我为左边的鞋子制作了绿色的鞋带,那么右边的鞋子总会有绿色的鞋带.排除故障的问题很容易,因为唯一的时间,正确的鞋子失去它是独特的选择,如红色花边,是当我设置左鞋的花边颜色.
console.log("THE RIGHT LACE BEFORE: " + rightShoe.laceId); leftShoe.laceId = 'green'; console.log("THE RIGHT LACE AFTER: " + rightShoe.laceId);
THE RIGHT LACE BEFORE: red
THE RIGHT LACE AFTER: green
即使我没有改变rightShoe,只要我改变了leftShoe属性,它就被改变了.
所以我回到了我第一次定义leftShoe对象的位置,这是用户在脚本生命中第一次点击“交换”(我的业余的想法是为什么传播和填充leftShoe对象,如果用户可能永远不会自定义左鞋?也许这是不必要的数据吝啬,我不知道).从那时起,我从来没有重新定义leftShoe成为rightShoe的副本,反之亦然.我想我被挂断了,我可能正在做对象引用,就像其他语言一样,我正在改变引用而不是值.
在我遇到麻烦之前,我想制作一个JSFiddle来重现问题.由于我的项目冗长(约1500行,包括一些用于图形的THREE.js),我尽力模拟该过程.所以here it is.
除了JSFiddle的工作正如我预期的那样!左侧模型保留了该属性的唯一属性和数据.所以,我做了一些挖掘和阅读关于object.assign()方法.所以在我原来的项目代码(不是小提琴)中,我改变了这一点:
leftShoe = rightShoe;
到这个:
leftShoe = Object.assign({},rightShoe);
令我兴奋的是,我终于得到这个工作,我同样感到困惑和困惑,因为我不明白为什么我的JSFiddle不需要assign()方法,但我相同的项目代码.谢谢.