2013-07-13 48 views
0

我有兩個班,一個持有並管理數據和一個使基於數據對象沒有被引用傳遞(CoffeeScript的)

module.exports = class Data 
    constructor:() -> 
     @stuff = 
      foo: 42 
      bar: 'something' 

,並在另一個文件

module.exports = class Mutator 
    constructor: (Data) -> 
     @foo = Data.foo 

決定並在一個主文件中

Data = require './Data' 
Mutator = require './Mutator' 

module.exports = class Main 
    constructor:() -> 
     @data = new Data() 
     @mutator = new Mutator(@data) 

我遇到的問題是,@data似乎並沒有過去通過參考

在主

console.log @Mutator.foo # 42 
@data.foo = '24' 
console.log @Mutator.foo # still 42 

什麼引起該D?

回答

3

@data正在按引用傳遞,但你扔的是引用方式,當你在這裏拉出Data.foo值:

@foo = Data.foo 

Data相同的@data@fooData.foo只是價值。你需要守住Data而不是Data.foo

class Mutator 
    constructor: (Data) -> 
     @data = Data 

再看看@mutator.data.foo。您可能可以使用defineProperty來爲foo定義一個吸氣劑,從而隱藏data零件並使@mutator.foo正常工作。請看this answer關於這個工作的一些注意事項。

+0

如果'foo'是一個對象'{}'並且我像這樣傳遞了它,'@mutator = new Mutator(@ data.foo)',然後像這樣設置'@foo = foo',它會起作用嗎? – Loourr

+1

只要人們說'@data.foo.x = 6'而不是'@data.foo = {x:6}',這樣引用就不會改變。 –