了解singleton创建共享全局状态这一事实,我可能会想要单例,例如redux store / state对象。
如果我使用的是ES模块,我可以使用以下简单代码创建单例:
// a.js (singleton module)
class A {}
// Create singleton
export const a = new A();
现在我可以在另一个模块中的任何地方使用这个实例化对象:
// b.js
// Import singleton
import { a } from './a.js';
console.log(a);
// c.js - some other nested file
import { a } from '../../a.js';
console.log(a);
理论上,应该可以如上所述管理单例创建。但截至今天,我们使用模块捆绑包(如 Webpack.js 或 Rollup.js )向浏览器提供JavaScript。如果这些捆绑包偶然/有意地不止一次包含某些模块,该怎么办?我能想象到的最简单的事情是,如果我有某种符号链接,它可以通过不同的路径解析到同一个模块。或者它可能只是模块解析过程中的一个错误。
我的问题是 - 这些模块捆绑包是否始终确保创建单个对象的模块在每种情况下都保持单身?
我还没有完全研究过一个主题。我知道 ES符号是全局唯一的,它们用于创建私有对象成员。这是我的下一个问题 - 这个符号的特征是否有助于我创建一个真正的单例?(我相信如果捆绑过程不合理,符号也会遇到同样的问题。)
最后,最后一个问题:是否有可能在JavaScript中可靠地创建一个真正的单例?
注意:我不试图防范Module bundler中的错误。错误类比只是说明这个想法的一种比喻。
答案 0 :(得分:1)
我经常使用该模式进行汇总,从未遇到过问题。或者,您可以像这样定义一个单身:
//singleton.js
let instance;
class Singleton{
constructor(){
if(instance){
return instance;
}
instance = this;
}
}
var a = new Singleton();
var b = new Singleton();
a === b // true