我正在尝试在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的值设置为1255 * 25)。

关于javascript - 避免CoffeeScript传递对象引用样式的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24962943/

10-12 14:11