【问题标题】:Forcing singleton pattern in shared external modules在共享的外部模块中强制使用单例模式
【发布时间】:2018-04-06 22:15:26
【问题描述】:
假设我们有 2 个 js 模块(A,B),它们需要一个通用模块“C”,它是一个单例或具有静态方法。
如果它们都需要相同的 C 实例,那么一切都很好。但是如果由于某种原因 require 方法将解析为不同的文件(例如,如果它们需要不同的版本,或者如果 C 模块捆绑在其中一个中),那么我们将有 2 个不同的 C 实例,即使它被设置为单身人士。
即使代码可以存在两次,我们如何在 javascript 中强制使用单例模式?
我可以使用全局命名空间,还是有更好的模式?
如果是这样,如何正确使用全局?
【问题讨论】:
标签:
javascript
node.js
webpack
singleton
【解决方案1】:
似乎使用全局作用域是唯一的方法,但有一些方法可以让使用符号更安全。
// create a unique, global symbol name
// -----------------------------------
const FOO_KEY = Symbol.for("My.App.Namespace.foo");
// check if the global object has this symbol
// add it if it does not have the symbol, yet
// ------------------------------------------
var globalSymbols = Object.getOwnPropertySymbols(global);
var hasFoo = (globalSymbols.indexOf(FOO_KEY) > -1);
if (!hasFoo){
global[FOO_KEY] = {
foo: "bar"
};
}
// define the singleton API
// ------------------------
var singleton = {};
Object.defineProperty(singleton, "instance", {
get: function(){
return global[FOO_KEY];
}
});
// ensure the API is never changed
// -------------------------------
Object.freeze(singleton);
// export the singleton API only
// -----------------------------
module.exports = singleton;
基于教程found here