我只是在研究用JavaScript定义单例的方法,在查看了几个示例后,我想到了以下我无法找到的方法:
function MyClass() {
if (MyClass._sharedInstance === undefined) {
// actual constructor code
MyClass._sharedInstance = this;
}
return MyClass._sharedInstance;
}
MyClass._sharedInstance = undefined;
似乎工作正常......但我无法在任何地方找到这一点的事实让我产生怀疑。有没有理由不以这种方式做单身,特别是考虑到JavaScript的许多小陷阱。我知道通过简单地执行var MyClass = { /* MyClass Stuff */ }
我可以用更少的代码来实现单例,但为了保持一致性,我想使用原型来定义所有类。
答案 0 :(得分:1)
建议的解决方案似乎并没有解决问题。任何 1 ;因此, 我推荐一种简单模块模式的标准变体"使用惯用语IIFE:
MySingleton = (function () {
// This function is only executed once
// and whatever is returned is the singleton.
return {
// Expose members here
};
})();
根据具体需要,还可以返回一个新的对象,使这种模式更加灵活,而无需引入单独的"单例"田野和守卫,例如。
MySingleton = (function () {
// Contrived, but valid - any object returned
// functions as the singleton.
function MyClass {}
return new MyClass();
})();
1 如果有的话,可能会导致一些" WTF?" new MyClass()
返回不是"正常"的共享/单个对象的时刻行为。