如何在Node中使用coffeescript的命名空间代码?

时间:2013-02-06 23:10:04

标签: node.js oop coffeescript

相关:Classes within Coffeescript 'Namespace'

好的,所以读完那篇文章之后,我抓住了命名空间函数并把它放在自己的文件中。

namespace.coffee

namespace = (target, name, block) ->
  [target, name, block] = [(if typeof exports isnt 'undefined' then exports else window), arguments...] if arguments.length < 3
  top    = target
  target = target[item] or= {} for item in name.split '.'
  block target, top
  console.log "created namespace "+ name


root = exports ? window
root.namespace = namespace

然后在Repl:

>  namespace = require('./assets/js/namespace.js').namespace
[Function]                                              

如果我toString()它是正确的。

好的,现在我想用它:ns.coffee(来自Sandro的答案)

namespace = require('./namespace.js').namespace

class MyFirstClass
  myFunc: () ->
    console.log 'works'

class MySecondClass
  constructor: (@options = {}) ->
  myFunc: () ->
    console.log 'works too'
    console.log @options

namespace "Project.Something", (exports) ->
  exports.MyFirstClass = MyFirstClass
  exports.MySecondClass = MySecondClass
  console.log 'done with exports'

然后我在Repl中运行它:

  

ns = require('./ assets / js / ns.js')#compiled ns.coffee
  完成出口
  创建名称空间Project.Something
  {}

它似乎不起作用:

> ns.MyFirstClass                                              
undefined                                                      
> ns.MySecondClass                                             
undefined                                                      
> ns.Project.Something.MySecondClass                           
TypeError: Cannot read property 'Something' of undefined      

我在这里做错了吗?

1 个答案:

答案 0 :(得分:0)

exports变量是您从引用它的文件的module.exports 。因此,当您致电namespace时,它会更改exports require返回的namespace,而不是require ns返回的namespace }}

注意target如何获取3个参数,但其中的第一行基本上使target成为可选参数。如果您传入exports(您可能需要exports ? window,或者如果需要在服务器和客户端中运行,则可能需要{{1}}),那么它应该执行您想要的操作。