我已经习惯了以下语法,我相信这是广泛使用的:
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 };
我发现当使用这种语法时,智能感知在Visual Studio Code中工作非常方便。
任何人都可以看到此语法的任何问题,如果是这样,请修改它以提出更好的语法?
我读了这篇文章如何在 JavaScript 中声明命名空间?并发现了许多建议的语法,但大多数是在 ECS6 之前给出的。
在 ES2015+ 中,基本上你不再需要这些假命名空间了。请改用模块。(也许使用模块加载器,因为对模块的本机支持仍然只是刚刚进入浏览器。
但是,如果你想继续使用假命名空间,也许暂时直到对模块的本机支持变得更加普遍,你所拥有的很好,尽管Foo
声明class
并没有真正的优势,而不仅仅是让它成为对象,就像你原来的例子一样:
var Foo = Foo || {};
Foo.Bar = class Bar{
constructor(){
this.stuff = null;
}
get moreStuff(){ return this.stuff++;}
do(){...}
};
但是你的版本很好,除了给人的印象是Foo
可以用来构造一些有用的东西,除了如果你在两个文件中这样做,它会失败(而你使用var foo = foo || {};
的第一个示例很高兴你在两个文件中这样做并将它们都包含在同一页面上, 也许一个定义foo.Something
和另一个定义foo.SomethingElse
(。