无法从课堂外访问我的coffeescript课程中的方法

时间:2012-11-19 03:31:41

标签: javascript oop coffeescript

我用CoffeeScript编写了这个类:

Notification.js.coffee

class Notification

  display: ->
    @dom.show()

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

基本上,render()函数代码的逻辑是将HTML注入DOM(但隐藏)和display()方法只是shows DOM元素。现在,我有一些其他类与这个类别分开,我正在尝试使用上面的类。

SharerController.js.coffee

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' is not a function (evaluating 'notification.display()')

在上面的行notification.display()。相同的代码完全按预期工作如果我在Notification类中写入它(其中所有内容都被包装到IIFE中)。上述文件的加载顺序为:Notification.js,然后是SharerController.js

我到底错过了什么?

1 个答案:

答案 0 :(得分:0)

你遗漏了几件事:

  1. Notification中的SharerController与您在Notification中定义的Notification.js.coffee不同。我认为您正在使用Chrome的原生Notification并且没有display方法。
  2. @dom中没有Notification,因此如果您设法调用它,display来电将会失败。
  3. render中没有Notification方法,因此您的Notification构造函数会因@render调用而失败。
  4. 如果您只包含Notification代码的样本,则(2)和(3)不是真正的问题。

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

    (function() {
      // JavaScript goes here...
    }).call(this);
    

    因此,您的Notification文件无法显示Notification.js.coffee。您可以通过说:

    使其全局可见
    class window.Notification
      #...
    

    class @Notification
      #...
    

    或者您可以使用自己的命名空间as in this other question

    Notification提供给应用程序的其余部分后,您可以实例化自己的Notification,解决其他问题,最后您将调用display具有display方法的东西。