【问题标题】:Define multiple instances of Module (pattern) in JavaScript在 JavaScript 中定义多个 Module(模式)实例
【发布时间】:2016-06-06 07:15:32
【问题描述】:

我正在尝试找到如何创建多个实例并根据Module 模式配置我的模块的最佳方法。

目前我有

var Logger = (function () {
    // Private members
    var _settings = {
        json: JSON,
        output: console
    };
    // Private methods
    var _log = function (info) {
        _settings.output.log(info);
    };
    var _dump = function (info) {
        _log(_settings.json.stringify(info));
    };
    // Change default settings
    var changeSettings = function (settingsArgs) {
        if (settingsArgs !== undefined) {
            if (settingsArgs.json !== undefined) {
                _settings.json = settingsArgs.json;
            }
            if (settingsArgs.output !== undefined) {
                _settings.output = settingsArgs.output;
            }
        }
    };
    return {
        init: changeSettings,
        log: _log,
        dump: _dump
    };
})();

我对这种模式有几个问题。

  1. 为模块提供配置的最佳方式是什么,我只是为私有设置字段创建了setter,但我觉得这不是实现它的最佳方式。请提出正确的方法。

  2. 如何创建我的模块的多个实例。据我了解,模块通常用于封装全局对象和逻辑(如单例),所以大多数时候只有一个模块实例存在,但我需要有多个实例。在我的情况下,这可能很有用,例如,我可以创建一个记录器 ConsoleLogger 另一个将是 AlertLogger 不同之处在于输出,但现在我只能有一个实例。

请建议正确的方法,我已经阅读了很多文章,但还没有找到问题的答案。谢谢

【问题讨论】:

    标签: javascript design-patterns module


    【解决方案1】:

    您所拥有的是用作立即调用函数表达式 (IIFE) 的模块,因为末尾是 ()。因此,您在类定义时创建实例,并且您只能拥有一个实例。您可以克隆一个实例并拥有多个实例,但这不是一件好事。

    如果你想拥有多个实例,你应该在最后删除 IIFE 表达式。此外,您可以将设置作为构造函数参数传递:

     var Logger = function (settingsArgs) {};
    

    现在,您可以创建多个实例:

     var consoleLogger = new Logger({output: console});
     var alertLogger = new Logger({output: alert}); // change this line probably, for this to work _settings.output.log(info);
    

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2021-04-04
      • 2013-10-06
      • 2022-01-20
      相关资源
      最近更新 更多