如何在JavaScript ECS6

时间:2018-02-03 16:57:24

标签: javascript ecmascript-6 namespaces

我习惯了以下语法 - 我相信 - 广泛使用:

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之前给出的。

1 个答案:

答案 0 :(得分:2)

在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。)