在javascript中只允许类成员的一个实例

在javascript中只允许类成员的一个实例,javascript,ecmascript-6,Javascript,Ecmascript 6,我在GoogleMapAPI前面创建了一个助手类——只是为了学习 我希望在我的类中只保留google.maps.Map对象的一个实例,即使有人决定实例化该类的另一个实例 我来自.NET背景,这里的概念很简单——但是我仍然习惯于javascript(和ES6),所以任何指针都非常受欢迎 这里有一个片段(通过评论)来解释我的意图 class-Foo{ 建造师(酒吧){ //如果其他人决定创建一个新实例 //对于“Foo”,则“this.bar”不应再次设置。 //我意识到实例化构造函数是不正确的。

我在GoogleMapAPI前面创建了一个助手类——只是为了学习

我希望在我的类中只保留google.maps.Map对象的一个实例,即使有人决定实例化该类的另一个实例

我来自.NET背景,这里的概念很简单——但是我仍然习惯于javascript(和ES6),所以任何指针都非常受欢迎

这里有一个片段(通过评论)来解释我的意图

class-Foo{
建造师(酒吧){
//如果其他人决定创建一个新实例
//对于“Foo”,则“this.bar”不应再次设置。
//我意识到实例化构造函数是不正确的。
//在C#中,我会通过创建一个静态类来解决这个问题,使
//“bar”类上的静态属性。
这个.bar=bar;
}

}
我想这就是你想要的:

var实例=null;
福班{
建造师(酒吧){
如果(实例){
抛出新错误('Foo已经有一个实例!!!');
}
实例=此;
这个.bar=bar;
}
}


我想这就是你想要的:

var实例=null;
福班{
建造师(酒吧){
如果(实例){
抛出新错误('Foo已经有一个实例!!!');
}
实例=此;
这个.bar=bar;
}
}


为什么不立一面旗呢<代码>如果(标志)返回;/*早期*/flag=true。您可能还想考虑不要在全局上公开构造函数。在JavaScript中,与C++静态类相当的粗糙是在构造函数上存储一些属性。在Javascript中,函数是对象,因此它们也可以有属性。在你的例子中,你可以使用<代码> fo.bar >代码>。考虑在只返回一个实例的IFE中包装构造函数。无法再次调用它。是否需要具有不同状态的多个
Foo
实例?如果没有,则不要对其使用
类。用一个简单的对象文字创建一个“模块”。谢谢@Bergi-你完全正确。为什么不设置一个标志呢<代码>如果(标志)返回;/*早期*/flag=true。您可能还想考虑不要在全局上公开构造函数。在JavaScript中,与C++静态类相当的粗糙是在构造函数上存储一些属性。在Javascript中,函数是对象,因此它们也可以有属性。在你的例子中,你可以使用<代码> fo.bar >代码>。考虑在只返回一个实例的IFE中包装构造函数。无法再次调用它。是否需要具有不同状态的多个
Foo
实例?如果没有,则不要对其使用
类。使用一个简单的对象文字创建一个“模块”。谢谢@Bergi-你完全正确。除非有人重置了Foo.\u实例…好吧,有人不应该这样做,因为它是私有属性(好吧,“伪”私有)。但是,这一点很好。更新了答案。如果OP担心“某人”创建第二个实例,那么“某人”可以做很多事情…;-)直到有人重置Foo.\u实例…好吧,有人不应该这样做,因为它是私有财产(好吧,“伪”私有)。但是,这一点很好。更新了答案。如果OP担心“某人”创建第二个实例,那么“某人”可以做很多事情…;-)
class Foo {
  constructor(bar) {
    if (Foo._instance) {
      throw new Error('Foo already has an instance!!!');
    }
    Foo._instance = this;

    this.bar = bar;
  }
}