0

在 coffeescript 中,您可以通过在定义前加上@符号来将对象或类分配给全局命名空间。

例如

class @Dog #This is now available via window.Dog due to the @
   constructor : () ->

但是有没有办法将@符号分配给另一个对象,而不是窗口?

当我尝试@ = {}时,我得到了error: unexpected =

这将允许您始终将您的对象定义为命名空间,但稍后改变您对命名空间的想法。它允许您避免逐个导出。您可以在测试时将 @ 设置为 global,然后在部署时将其设置为备用命名空间。

如果有更好的方法或替代方法来实现类似的目标,那也很棒!

4

3 回答 3

1

不能将某些内容分配给this,this是范围变量。

你可以做一些函数来设置命名空间:

@scope = do ( -> return @ ) #change `@` at the end to your namespace

然后你会这样做:

class @scope.Dog
   constructor: () ->
      ...

解析为:

this.scope = (function() {
  return this;
})();

this.scope.Dog = (function() {

  function Dog() {
      ...
  }

  return Dog;

})();
于 2013-08-30T13:17:06.137 回答
0

您不能this在顶层更改,但可以调用具有不同this范围的函数:

(->
  class @Dog
    talk: -> console.log 'woof!'
  class @Cat
    talk: -> console.log 'meow'
).call animals = {}

# Now the animals "namespace" has a Cat and a Dog properties.
(new scope.Cat).talk()

该示例没有太大意义,因为它可以写成animals = {}; class animals.Cat并避免需要额外的嵌套级别,但是如果您正在寻找this在某个时候动态更改,很高兴知道存在Function#call:)

于 2013-08-31T23:58:53.740 回答
0

使用 @ 作为对窗口对象的引用可能会产生误导,并可能导致错误(当上下文发生变化时)。更好的是声明一些自定义命名空间。

您在要加载的第一个脚本中添加了一行:

window.myns ?= {}

...然后使用它而不是 @ 喜欢:

class myns.Dog

为了安全起见,您将命名空间声明行添加到您将在其中引用它的每个文件的顶部。但这不是强制性的。只要确保脚本以正确的顺序加载。

于 2013-09-02T14:04:40.773 回答