coffeescript - 为 CoffeeScript 类创建命名空间

标签 coffeescript

如何为用 CoffeeScript 编写的类创建命名空间?

例如,我有树类AaBbCc。我希望它们插入全局可访问的命名空间 - MyClasses,允许跨它们进行通信并在 jasmine-node 中使用它们。

class MyClasses.Aa
 @someProp: true

class MyClasses.Bb
 @someProp2: false

class MyClasses.Cc
 @doSomeStuff: -> MyClasses.Aa.someProp = false

我知道,我可以将它们注入(inject)一个文件并编译,但我想要一个类 = 一个文件。

请问我该怎么做? 谢谢!

编辑:我试过这种方式,但我认为它不好,但它在浏览器和 jasmine-node 中有效

root = exports ? this
root.MyClasses = root.MyClasses ? {}

root.MyClasses.Aa = 

  class Aa

最佳答案

使用 RequireJS。

在一个名为“my-classes.coffee”的文件中,定义命名空间。

define [], ->
  # You need this if you want it to work in multiple environments.
  # Otherwise just use `window` to work in the browser.
  root = exports ? this

  root.MyClasses = {}

您可以在另一个名为“aa.coffee”的文件中定义您的类。

define ['my-classes'], (MyClasses) ->

  class MyClasses.Aa
    @someProp: true

另一个文件:

define ['my-classes'], (MyClasses) ->

  class MyClasses.Bb
    @someProp2: false

现在,当您需要时,它应该导出 MyClasses,其中包括 MyClasses.Aa

require ['my-classes', 'aa'], (MyClasses, _) ->
  console.log MyClasses.Aa.someProp

这样做的一个问题是您不能仅依赖于 require 语句中的“my-classes”。如果这样做,MyClasses.Aa 将是未定义的。但是您也不能只依赖“aa”,因为“aa”除了添加到 MyClasses 之外不会导出任何内容。在上面的代码片段中,MyClasses.Bb 是未定义的,因为我没有明确依赖它。这就是为什么许多人要么使用一个巨大的文件,要么复制重新导出命名空间的样板。

如果有人知道如何解决这个问题,请告诉我。

我个人认为 RequireJS 使用起来很复杂,而且有很多不同的设置方法。我将它与 jasmine 一起使用的一种方法是使用 cake 任务将我的 CoffeeScript 预编译为 JavaScript,然后得到这样的规范文件。

requirejs = require('requirejs')
# Set the baseURL to your compiled JS dir.
requirejs.config { baseUrl: __dirname + '/../lib' }

requirejs ['my-classes', 'aa'], (MyClasses, _) ->

  describe "someProp", ->
    it "should be true", ->
      expect(MyClasses.Aa.someProp).toEqual true

这可能不是最好的方法,但我能够使用它在浏览器、Node 服务器和 jasmine-node 测试中运行模块。我还看到有些人使用 custom runners避免在他们的规范文件中使用样板文件。

如果您不想使用 RequireJS,您可能会发现 this question有帮助。它通过使用定义在 CoffeeScript FAQs 上的 namespace 函数来工作。 .

关于coffeescript - 为 CoffeeScript 类创建命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13574352/

相关文章:

javascript - 在 PhpStorm 中创建自定义语言,扩展所有 html 语言功能

javascript - 如何删除return语句

javascript - 如何在 Rails 中使用 Jquery 和 Coffeescript 隐藏元素?

javascript - 将 Node.js 脚本的标准输出通过管道传输到另一个脚本的标准输入不起作用

javascript - 如何在生态模板中打印 _each 方法的结果

javascript - 如何使这个示例功能适应Backbone?

javascript - 在父类中初始化变量(JavaScript/CoffeeScript 习语)

javascript - CoffeeScript 中循环指针的增量

javascript - foreach 循环,链接到 CoffeeScript 中的 'this'

javascript - coffeescript 和 jquery 为背景图片生成完整的 url?