JS模块模式:为什么赋值在扩展?

时间:2014-09-03 20:10:08

标签: javascript module-pattern

我看到很多代码herehere

var module = (function (module) {
    module.prototype.something_else = function () {
    };
    return module;
})(module);

为什么var module =部分存在?为什么return module;如果不需要前一部分呢?

我看到了:

的用法
var module = (function(module) {...})(module || {});

对于有时候module尚未定义的情况......是否是上述情况?

2 个答案:

答案 0 :(得分:3)

此代码块仅在模块已定义并且您想要扩展它时使用(例如,添加新方法):

var module = (function (module) {
    module.prototype.something_else = function () {
    };
    return module;
})(module);

它接受module作为输入参数并返回扩展的module。然后,var module =的分配将替换原始module

逐一回答您的问题:

  

为什么var module = part存在?

在上面的示例中(取自您的第一个网址),不需要var module =。他们提供的简单例子很愚蠢。你可以完成同样的事情:

module.prototype.something_else = function () {};

使用上面的模式扩展一个类对第二个URL(http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html)中提供的示例更有意义:

var MODULE = (function (my) {
    var old_moduleMethod = my.moduleMethod;

    my.moduleMethod = function () {
        // method override, has access to old through old_moduleMethod...
    };

    return my;
}(MODULE));

立即执行功能创建一个新范围,我们可以保留旧方法var old_moduleMethod = my.moduleMethod;

下一个问题:

  

为什么返回模块;如果不需要前一部分?

您需要return module,否则函数不会返回任何内容,而var module =赋值将设置为未定义的值。

下一个问题:

  

对于模块有时尚未定义的情况......是否是上述情况?

是的,就是这样。如果未定义module,则需要传入一个空对象。但是,如果没有首先定义对象,通常会使用模式来扩展对象。这没有任何意义,只会使你的代码复杂化。

答案 1 :(得分:1)

要理解,重命名标识符以获得等效的

会有所帮助
var module = (function (module_impl) {
    module_impl.prototype.something_else = function () {
    };
    return module_impl;
})(module || {});

module_impl是保存模块的公共API的对象。因此,在填充之后,匿名函数会将其返回给调用者,调用者将其分配给全局module。这样,API现在可以使用module,而任何实现细节都隐藏在由匿名函数创建的闭包中。

module || {}现在是允许扩充:第一次调用它时,module仍然是undefined,因为尚未发生对匿名函数返回值的赋值。因此`模块|| {}计算到第二个操作数。

进一步说明为什么需要分配。第一次调用存根,它实际上与

相同
var module = (function () {
    var module_impl = {};
     // ...
     return module_impl;
})());