【问题标题】: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

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 2015-03-21
      相关资源
      最近更新 更多