Javascript 避免CoffeeScript传递对象引用样式的方法
我正在尝试复制(特别是深度复制)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变
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
函数只是一个演示。它不在使用中。我发布了realmul
函数的功能。为了澄清,我试图用该实例以前的值修改该实例的值。所以在这种情况下,我需要一个副本,这样我可以在使用之前的值时进行更改,对吗?至于第二点,复制的目标是使一个对象具有匹配的值,但将它们分开,以便它们可以在不更改此
实例的情况下进行更改。如果说得通的话,我还是不明白。语句x.copy(x)
制作了一个副本,但不会将结果保存在任何地方;因此,它实际上什么也不做。然后将“x”传递到.mul()
中,这将更改“x”。好的,我现在明白了。谢谢你的帮助和良好的回答!
@m01 = x1 * b.m00