你有兩個問題:
@
是說在CoffeeScript中this
的另一種方式。這就是全部意思。
- 類(或多或少)只是CoffeeScript中的其他變量或屬性。
所以,當你說@A
,你只是在尋找的this
的A
財產,你show
實際上是說:
a = new this.A("eric")
在這種情況下,@
將是B
和B
實例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來管理您的依賴關係,使用全局特定於應用程序的對象來管理作用域,...