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

Javascript 避免CoffeeScript传递对象引用样式的方法,javascript,coffeescript,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变

我正在尝试复制(特别是深度复制)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”的功能:

您的代码使用“x”作为上下文和参数(“b”)调用“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
)。

我不明白-mul函数应该做什么?如果它应该改变对象本身,为什么你需要一个副本呢?如果它应该返回一个新实例,为什么函数要更新
@m00
@m01
,而不是
copy.m00
copy.m01
?我认为“copy”函数不应该接受参数-它应该是一个返回
this
副本的函数-在每个实例上都有一个函数,它接受要复制的对象的参数,这很奇怪。
mul
函数只是一个演示。它不在使用中。我发布了real
mul
函数的功能。为了澄清,我试图用该实例以前的值修改该实例的值。所以在这种情况下,我需要一个副本,这样我可以在使用之前的值时进行更改,对吗?至于第二点,复制的目标是使一个对象具有匹配的值,但将它们分开,以便它们可以在不更改
实例的情况下进行更改。如果说得通的话,我还是不明白。语句
x.copy(x)
制作了一个副本,但不会将结果保存在任何地方;因此,它实际上什么也不做。然后将“x”传递到
.mul()
中,这将更改“x”。好的,我现在明白了。谢谢你的帮助和良好的回答!
    @m01 = x1 * b.m00