Javascript 无法从类外部访问我的coffeescript类中的方法

Javascript 无法从类外部访问我的coffeescript类中的方法,javascript,oop,coffeescript,Javascript,Oop,Coffeescript,我用咖啡脚本写了这门课: Notification.js.coffee class Notification display: -> @dom.show() constructor: (header, messages) -> @render(header, messages) class SharerController post_story: -> # some user action posting something in t

我用咖啡脚本写了这门课:

Notification.js.coffee

class Notification

  display: ->
    @dom.show()

  constructor: (header, messages) ->
    @render(header, messages)
class SharerController

  post_story: ->
    # some user action posting something in the app
    notification = new Notification('Header', ['This story has been posted.', 'You can post more. Would you like to?'])
    notification.display()
基本上,
render()
函数代码的逻辑是将HTML注入DOM(但隐藏),而
display()
方法只显示DOM元素。现在,我有另一个独立于这个类的类,我试图利用上面的类

SharerController.js.coffee

class Notification

  display: ->
    @dom.show()

  constructor: (header, messages) ->
    @render(header, messages)
class SharerController

  post_story: ->
    # some user action posting something in the app
    notification = new Notification('Header', ['This story has been posted.', 'You can post more. Would you like to?'])
    notification.display()
不幸的是,出于某种原因,我

TypeError:“undefined”不是函数(计算“notification.display()”)

在上面的行中,我执行
notification.display()
。如果我在Notification类中编写相同的代码(在该类中,所有内容都被包装到一个IIFE中),那么它的工作原理与预期完全相同。上述文件的加载顺序是:Notification.js,然后是shaerrcontroller.js


我到底错过了什么?

你错过了几件事:

  • 您的
    共享控制器中的
    通知
    与您在
    Notification.js.coffee
    中定义的
    通知
    不同。我认为你正在学习Chrome的原生功能,而它没有
    显示方法
  • 您的
    通知中没有
    @dom
    ,因此如果您试图调用它,
    显示
    调用将失败
  • 通知中没有
    呈现
    方法,因此
    通知
    构造函数将由于
    @render
    调用而失败
  • 如果您只包含了一个
    通知的样本
    代码,那么(2)和(3)并不是真正的问题

    CoffeeScript将生成的JavaScript封装在一个自动执行函数中,如下所示:

    (function() {
      // JavaScript goes here...
    }).call(this);
    
    因此,您的
    通知
    Notification.js.coffee
    文件外不可见。您可以通过以下方式使其全局可见:

    class window.Notification
      #...
    

    或者您可以使用自己的名称空间


    一旦应用程序的其余部分可以使用
    通知
    ,您就可以实例化自己的
    通知
    ,解决其他问题,最后您将对具有
    显示
    方法的对象调用
    显示

    1,2和3真的不是问题,因为我只包含了代码的一些部分。但我发现名称空间和范围在这里起作用。