【问题标题】:coffeescript Class not accessible in main javascript主javascript中无法访问coffeescript类
【发布时间】:2012-04-23 01:02:46
【问题描述】:

我有一个用coffeescript编写的课程,例如,

class Example
  constructor: ->
    $.each [1, 2, 3], (key, value) =>
      @test = value
    return @test
  render: ->
    alert @test

我把这个类作为一个单独的文件,Example.coffee

现在我希望能够像这样在我的主 javascript 文件中实例化:

d = new Example
d.render()

但该类是未定义的,即使它作为脚本包含在页面上,例如

<script src="Example.js></script>
<script src="main.js"></script>

您如何使该类对主文件公开可用?

【问题讨论】:

标签: javascript coffeescript


【解决方案1】:

我知道这是一个旧线程,但如果其他人觉得它有用,请使用“@”声明您的类,.coffee 文件之外的.js 文件可以访问它。

所以,在example.coffee

class Introverted
  honk: ->
    alert "This class is visible within the .coffee file but not outside"

class @Extroverted
  honk: ->
    alert "This class is visible inside and outside of the .coffee file"

编译为example.js,然后可以在example.html中使用:

<script src="example.js"></script>
<script>
var p = new Extroverted(); // works fine
p.honk();

var i = new Introverted(); // will fail with "Introverted is not defined"
i.honk();
</script>

【讨论】:

  • 这实际上与mu is too short 的答案相同。 @Extroverted 将编译为 this.Extroverted,在这种情况下,它实际上与 window.Extroverted 相同。
  • 只是添加到上面尼克的评论中,以防万一有人想知道...之所以可行是因为@ 是咖啡脚本中this. 的快捷方式。就像他说的那样,在上面的上下文中,thiswindow,所以你将外向附加到窗口,有效地使其成为全局。
【解决方案2】:

您可以通过将您的类声明在window 命名空间中来声明您的类可全局访问(至少对于浏览器而言):

class window.Example
  constructor: ->
    $.each [1, 2, 3], (key, value) =>
      @test = value
    return @test
  render: ->
    alert @test

这会将Example 直接放入window。大多数情况下你也可以说class @Example

默认情况下,CoffeeScript 将每个文件包装在 (function() { ... })() 包装器中以防止命名空间污染。您可以通过在编译 CoffeeScript 时提供 -b 来防止这种情况:

-b, --bare
在没有顶级函数安全包装器的情况下编译 JavaScript。

但这可能不是你的选择(或者它可能是一个丑陋的选择)。通常的方法是在加载类之前在某处声明一个特定于应用程序的命名空间:

// Probably in a <script> in your top-level HTML...
App = { };

然后适当地命名你的类:

class App.Example
    #...

然后通过 App 命名空间引用所有内容。

【讨论】:

  • 有没有办法设置命名空间而不必求助于脚本标签?在我的尝试中并没有走得太远。谢谢!
  • @MichaeldeSilva:在浏览器环境中,您可以在类之前说出@App ?= { } 之类的内容来初始化window.App(如果它还没有的话)。或者你可以说class @C 把你的类放在全局范围内,如果合适的话。或者你可以使用像 require.js 这样的模块系统。
  • 感谢@mu的提示
【解决方案3】:

创建一个全局变量

window.Example = Example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2016-08-27
    相关资源
    最近更新 更多