Coffeescript类和范围

时间:2014-09-06 16:59:08

标签: coffeescript

在学习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不是函数。 任何帮助表示赞赏。

由于

1 个答案:

答案 0 :(得分:1)

你有两个问题:

  1. @只是在CoffeeScript中说this的另一种方式。这就是意思。
  2. 类(或多或少)只是CoffeeScript中的任何其他变量或属性。
  3. 因此,当您说@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来管理您的依赖项,使用特定于应用程序的全局对象来管理范围,...