2011-12-02 56 views
11

我是新來的CoffeeScript(和沒有經驗與JS太;很抱歉,如果這是天真的),我試圖創建下面的類:CoffeeScript的類成員

class Test 
    a: [] 

    make: -> 
     @a.push ['A', 'B', 'C'] 

    getdata: -> 
     output = "" 
     for i in @a 
      output += i 
     output 

b = new Test 
b.make() 

alert(b.getdata()) 


c = new Test 
c.make() 

alert(c.getdata()) 

我得到的輸出是: 「A,B,C」 「A,B,C,A,B,C」

儘管創建了'Test'的新實例,該數組會被追加並且不會被清除。我在這裏做錯了什麼?我初始化成員變量是否錯誤?

+3

你應該看看原型是如何工作的,並看看javascript生成的代碼。我在咖啡文本中看到了很多這種錯誤(甚至在教程/食譜中)。我使用的規則是僅定義類成員中的函數和靜態特性(我使用@member語法在構造函數中定義了實例屬性)。是的,它有點混淆關鍵字類咖啡的使用。 – Guillaume86

+3

備註:'getdata: - > @ a.join('')' – tokland

+0

感謝Guillaume86和托克蘭。我從中學到了很多東西。 – Anoop

回答

23

當您定義a: []時,您正在類原型上創建單個數組對象。您創建的每個類實例都具有相同的數組對象。無論何時一個實例修改該值,該更改對所有其他實例都是可見的。

請注意,只有在您的修改的值時纔會出現這種情況,例如將項添加到數組中。如果替換爲的值,例如通過分配一個新數組,這隻會影響當前實例。

當你想這時候實例實際上是建立在每個實例的基礎上,你應該在constructor來定義它,初始化的屬性:

class Test 
    constructor: -> 
     @a = [] 
     @a.push ['A', 'B', 'C'] 

    getdata: -> 
     output = "" 
     for i in @a 
      output += i 
     output 

b = new Test 

alert(b.getdata()) 


c = new Test 

alert(c.getdata()) 

Try this out,你會發現,它的工作原理是你要。

+1

難怪當人們看到類似的東西時,人們會感到困惑: http://coffeescriptcookbook.com/chapters/classes_and_objects/chaining – Guillaume86

+0

謝謝!現在我明白了。更讓我困惑的是修改/替換行爲的差異。現在也清除了。謝謝您的幫助。 – Anoop

+0

這個壞建議也在這裏重複http://arcturo.github.io/library/coffeescript/03_classes.html,我幾乎陷入了同樣的陷阱。我希望Coffeescript文檔會就此提供建議。 – aaron