0

相关:Coffeescript“命名空间”中的类

好的,所以在阅读了那篇文章后,我抓住了命名空间函数并将其放入自己的文件中。

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') # 编译后的 ns.coffee
使用导出
创建的命名空间 Project.Something
{}

它似乎不起作用:

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

我在这里做错了吗?

4

1 回答 1

0

exports变量是module.exports 您从中引用它的文件的. 因此,当您调用时namespace,它会更改exportsrequireing返回的内容namespace,而不是将从requireing返回的内容ns

请注意如何namespace接受 3 个参数,但其中的第一行本质上是target可选的。如果你传入target(你可能想要exports,或者exports ? window如果这需要在服务器和客户端中运行),那么它应该做你想要的。

于 2013-02-07T00:45:07.790 回答