在JavaScript中定义多个模块实例(模式)。

5

我正在尝试找到最佳方法来创建多个实例并根据 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,它们之间的区别在于输出,但现在我只能有一个实例。

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

1个回答

9
你手头有的是一个作为立即调用函数表达式(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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接