gpt4 book ai didi

javascript - 在共享外部模块中强制使用单例模式

转载 作者:太空宇宙 更新时间:2023-11-03 22:23:52 25 4
gpt4 key购买 nike

假设我们有 2 个 js 模块(A、B),它们需要一个公共(public)模块“C”,它是单例或具有静态方法。如果它们都需要相同的 C 实例,那么一切都很好。但是,如果由于某种原因 require 方法将解析为不同的文件(例如,如果它们需要不同的版本,或者 C 模块捆绑在其中一个文件中),那么我们将有 2 个不同的 C 实例,即使它设置为单例。

即使代码可以存在两次,我们如何在 JavaScript 中强制使用单例模式?我可以使用全局命名空间,还是有更好的模式?如果是这样,我如何正确使用全局?

最佳答案

似乎使用全局作用域是唯一的方法,但是有一些方法可以使用符号使其更安全。

// 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

关于javascript - 在共享外部模块中强制使用单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49701684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com