Javascript 将@分配给一个单独的对象,以便于命名空间

Javascript 将@分配给一个单独的对象,以便于命名空间,javascript,namespaces,coffeescript,Javascript,Namespaces,Coffeescript,在coffeescript中,可以通过在定义前面加上@符号,将对象或类指定给全局命名空间 e、 g 但是有没有办法将@符号指定给另一个对象,而不是窗口 当我尝试@={}时,我得到了错误:意外= 这将允许您始终将对象定义为名称空间,但在以后更改您对名称空间的看法。它允许您避免逐案导出。您可以在测试时将@设置为全局,然后在部署时将其设置为备用命名空间 如果有更好的方法或替代方法来实现类似的目标,那也太好了 您不能将某些内容分配给此,此是范围变量 我想您可以使用一些函数来设置名称空间: @scope

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

e、 g

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

当我尝试
@={}
时,我得到了
错误:意外=

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


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

您不能将某些内容分配给
是范围变量

我想您可以使用一些函数来设置名称空间:

@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;

})();

您不能在顶层更改
,但可以使用不同的
范围:

(->
  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={};将animals.Cat分类,避免需要额外的嵌套级别,但如果您希望在某个时候动态更改
this
,最好了解
函数调用的存在(call
:)

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

在要加载的第一个脚本中放入一行:

window.myns ?= {}
…以后使用它而不是@like:

class myns.Dog

为了安全起见,在要引用的每个文件的顶部添加名称空间声明行。但这不是强制性的。请确保按正确的顺序加载脚本。

我喜欢这种方法,谢谢。我最终在代码顶部定义了一个简单的对象
scope=@
,从那时起,文档中的所有内容都被定义为
scope.Dog
。您可以随时轻松地为所有对象更改名称空间,代码的任何读者都可以轻松地看到发生了什么。将
@scope
定义为我缺少的函数(相对于对象)是否有优势?
class myns.Dog