相关: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
我在这里做错了吗?
答案 0 :(得分:0)
exports
变量是您从引用它的文件的module.exports
。因此,当您致电namespace
时,它会更改exports
require
返回的namespace
,而不是require
ns
返回的namespace
}}
注意target
如何获取3个参数,但其中的第一行基本上使target
成为可选参数。如果您传入exports
(您可能需要exports ? window
,或者如果需要在服务器和客户端中运行,则可能需要{{1}}),那么它应该执行您想要的操作。