【问题标题】:How to declare a namespace in JavaScript ECS6如何在 JavaScript ECS6 中声明命名空间
【发布时间】:2018-07-13 23:05:28
【问题描述】:

我已经习惯了以下被广泛使用的语法:

var foo = foo || {};

(function() { 
    foo.bar = function(){
         return this;
    };
    foo.bar.prototype.stuff = null;      
    foo.bar.prototype.do = function(){...};
})();

它可以在有或没有关闭的情况下完成。

我使用 foo.bar.prototype.stuff 语法,以便在构造函数本身中没有所有定义。

在 ECS6 中,我尝试了以下语法:

class Foo{};

class Bar{
    constructor(){
      this.stuff = null;
    }        
    get moreStuff(){ return this.stuff++;} 
    do(){...}
}

Foo.Bar = Bar;

module.exports = { Foo };

我发现使用这种语法时,intellisense 在 Visual Studio Code 中工作非常方便。

任何人都可以看到这种语法有任何问题吗?如果有,可以提出一个更好的建议吗?

我阅读了这篇 How do I declare a namespace in JavaScript? 的帖子,发现了许多建议的语法,但大多数是在 ECS6 之前给出的。

【问题讨论】:

  • 我通常会说,为什么要将Bar 分配给Foo?您可以将两者都放入exports 并从那里访问它们。
  • @loganfsmyth 我有 C# 背景,所以我习惯于在分层命名空间中构建我的代码,我相信这在 JavaScript 中也很常见。如果有更好的方法,我会用它。
  • 通常对于模块化 JS,文件本身充当命名空间,所以你会这样做 module.exports = Bar; 就是这样。如果你需要这个类,你可以使用文件路径require()它。

标签: javascript ecmascript-6 namespaces


【解决方案1】:

在 ES2015+ 中,您基本上不再需要这些虚假的命名空间。相反,使用模块。 (也许使用模块加载器,因为对模块的本机支持仍然只是进入浏览器。)

但是,如果您想继续使用假命名空间,也许是暂时的,直到对模块的原生支持变得更加广泛,您所拥有的一切都很好,尽管将 Foo 声明为 class 并没有真正的优势,而不仅仅是使其成为与原始示例一样的对象:

var Foo = Foo || {};
Foo.Bar = class Bar{
    constructor(){
      this.stuff = null;
    }        
    get moreStuff(){ return this.stuff++;} 
    do(){...}
};

但是你的版本很好,除了给人的印象是Foo 可以用来构造一些有用的东西,而且如果你在两个文件中这样做,它会失败(而你的第一个例子使用@987654325 @ 很高兴您在两个文件中执行此操作,并将它们都包含在同一页面上,可能一个定义 foo.Something 另一个定义 foo.SomethingElse)。

【讨论】:

  • 这个。我没有什么可以补充的。
  • 感谢您的回答。您能否详细介绍如何使用模块构建命名空间?
  • @pasx:您根本不将这些伪命名空间与模块一起使用。您只需 export 模块中的绑定,以及其他代码 imports 它们。没有什么是全局的,如果您不想在导入时使用相同的名称(您可以导出Foo 并导入Bob)。这消除了命名冲突(除了模块标识符)。任何关于 ES2015 模块的不错的文章都应该能让你继续前进。 :-)
猜你喜欢
  • 2010-10-27
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2011-03-30
  • 1970-01-01
  • 2011-01-06
相关资源
最近更新 更多