我正在尝试在CoffeeScript中复制(特别是深复制)对象。这是问题所在:
class Mat
constructor: ->
@m00 = 5
@m01 = 3
mul: (b) ->
x1 = @m00
@m00 = x1 * b.m00
@m01 = x1 * b.m00
x = new Mat
x.mul(x)
alert x.m00 #25
alert x.m01 #125
如您所见,
x1设置为@ m00
@ m00更改
x1的更改与对@ m00的更改
我如何才能使副本成为具有值的新对象,以便更改实例的值不会影响它?我正在努力避免这种情况...
x1 = @m00
y1 = b.m00
@m00 = x1 * y1
编辑:
另一个例子
@m00 = b.m00 * copy.m00 + b.m01 * copy.m03 + b.m02 * copy.m06
@m01 = b.m00 * copy.m01 + b.m01 * copy.m04 + b.m02 * copy.m07
@m02 = b.m00 * copy.m02 + b.m01 * copy.m05 + b.m02 * copy.m08
@m03 = b.m03 * copy.m00 + b.m04 * copy.m03 + b.m05 * copy.m06
@m04 = b.m03 * copy.m01 + b.m04 * copy.m04 + b.m05 * copy.m07
@m05 = b.m03 * copy.m02 + b.m04 * copy.m05 + b.m05 * copy.m08
@m06 = b.m06 * copy.m00 + b.m07 * copy.m03 + b.m08 * copy.m06
@m07 = b.m06 * copy.m01 + b.m07 * copy.m04 + b.m08 * copy.m07
@m08 = b.m06 * copy.m02 + b.m07 * copy.m05 + b.m08 * copy.m08
最佳答案
我仍然不确定您要做什么,但让我们看看“ mul”的最新版本有什么作用:
mul: (b) ->
x1 = @m00
@m00 = x1 * b.m00
@m01 = x1 * b.m00
您的代码将上下文和参数(“ b”)都用“ x”调用“ mul”。因此,第一行代码
x1 = @m00
将局部变量“ x1”设置为
x.m00
。请记住,这与b.m00
相同。下一行代码将
x.m00
设置为“ x1”值乘以b.m00
的乘积,如果与x.m00
相同,则该乘积也将相同。因此, @m00 = x1 * b.m00
x.m00
的值(并且,因为“ b”和“ x”指的是同一对象,所以b.m00
)是25
。下一条语句:
@m01 = x1 * b.m00
将
x.m01
(和b.m01
)设置为“ x1”与b.m00
当前值的乘积。好吧,“ x1”仍然是5
,因为它没有被更改。但是由于前面的陈述,b.m00
现在为25
。因此,x.m01
的值设置为125
(5 * 25
)。关于javascript - 避免CoffeeScript传递对象引用样式的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24962943/