避免CoffeeScript传递对象引用样式的方法

时间:2014-07-25 19:12:51

标签: javascript coffeescript

我正在尝试在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

1 个答案:

答案 0 :(得分:1)

我仍然不确定你要做什么,但让我们来看看最新版本的" mul"作用:

  mul: (b) ->
    x1 = @m00
    @m00 = x1 * b.m00
    @m01 = x1 * b.m00

您的代码调用" mul"用" x"作为上下文和参数(" b")。因此,第一行代码

    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)。