2014-09-06 119 views
0

在學習CoffeeScript中,我試圖創建B類的方法內部類A的一個實例,這是代碼:CoffeeScript的類別和範圍

class @A 
    constructor: (@x) -> 
    show: -> 
    alert @x 

class @B 
    constructor: (@y) -> 
    show: -> 
    a = new @A("eric") 
    alert a.x 
    alert @y 

b = new @B("daniel") 
b.show() 

錯誤是類型錯誤:未定義的是不是一個功能。 任何幫助表示讚賞。

感謝

回答

1

你有兩個問題:

  1. @是說在CoffeeScript中this的另一種方式。這就是全部意思。
  2. 類(或多或少)只是CoffeeScript中的其他變量或屬性。

所以,當你說@A,你只是在尋找的thisA財產,你show實際上是說:

a = new this.A("eric") 

在這種情況下,@將是BB實例s沒有A屬性。相反,你應該只說:

a = new A('eric') 

使用@定義一個類時:

class @A 
    #... 

只是一種方法,使一類全局可用。在頂層,@將(幾乎總是)是在瀏覽器中window所以你其實是在說:

class window.A 
    #... 

window屬性是全局。請記住,每個CoffeeScript的file is wrapped in a function當它被轉換爲JavaScript:

Although suppressed within this documentation for clarity, all CoffeeScript output is wrapped in an anonymous function: (function(){ ... })(); This safety wrapper, combined with the automatic generation of the var keyword, make it exceedingly difficult to pollute the global namespace by accident.

所以,如果你只是說:

class A 

然後A將只提供給在該文件中的其他代碼。說:

class @A 

使A全球。

如果你只用一個文件工作,那麼你並不需要在你的類@ S:

class A 
    constructor: (@x) -> 
    show: -> 
    alert @x 

class B 
    constructor: (@y) -> 
    show: -> 
    a = new A("eric") 
    alert a.x 
    alert @y 

b = new B("daniel") 
b.show() 

@前綴一切的習慣,不要,只用它在你需要的時候上課,你確切地知道它會做什麼。即使您需要它,也有更好的方法:使用require.js來管理您的依賴關係,使用全局特定於應用程序的對象來管理作用域,...