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