在学习coffeescript时,我正在尝试在B类方法中创建一个A类实例,这是代码:
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()
错误是TypeError:undefined不是函数。 任何帮助表示赞赏。
由于
答案 0 :(得分:1)
你有两个问题:
@
只是在CoffeeScript中说this
的另一种方式。这就是意思。因此,当您说@A
时,您只是在寻找A
的{{1}}属性而您的this
真的在说:
show
在这种情况下,a = new this.A("eric")
将是@
和B
不具有B
属性的实例。相反,你应该说:
A
在定义类时使用a = new A('eric')
:
@
只是一种让全局可用的方法。在顶层,class @A
#...
将(几乎总是)在浏览器中@
,因此您真的在说:
window
和class window.A
#...
属性是全局变量。请记住每个CoffeeScript file is wrapped in a function在转换为JavaScript时的效果:
虽然为了清楚起见在本文档中进行了限制,但所有CoffeeScript输出都包含在一个匿名函数中:
window
此安全包装器与自动生成(function(){ ... })();
关键字相结合,使得污染非常困难意外的全局命名空间。
所以如果你刚才说:
var
然后class A
只能用于该文件中的其他代码。话说:
A
使class @A
全球化。
如果您只使用一个文件,那么您不需要在课程中使用A
:
@
不要养成使用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来管理您的依赖项,使用特定于应用程序的全局对象来管理范围,...