Javascript模块模式返回一个函数

时间:2014-11-26 20:33:27

标签: design-patterns javascript

这是模块模式:

var module1 = (function(){

    // private variable
    var private_var;

    // private method
    var private_method = function(){
        // ...
    }

    // public interface
    return {
      // A public variable
      publicVar: "foo",

      // A public function utilizing privates
      publicMethod: function( bar ) {
          // ..
      }
})()

我发现了一个类似的模式,其中返回值不是对象而是函数:

var module2 = (function(){

    // private variable
    var private_var;

    // private method
    var private_method = function(){
        // ...
    }

    // this is supposed to be a shortcut for me.doThings
    var me = function (options) {
      me.doThings(options); 
    }

    me.doThings = function(options) {
       // do something
    } 

    // returns a function instead of an object
    return me;      

 })()

使用如下:module2(options)

me实际上是me.doThings功能的快捷方式 我很困惑,如果这可以被视为模块模式。 module1module2

之间的主要区别和用例是什么?

2 个答案:

答案 0 :(得分:2)

我会认为你说明的两种方法都是模块模式,因为你在两种情况下都返回一个对象(记住函数是对象,也可以有属性)。

当您想要返回可能也具有属性的主构造函数时,module2中的示例很有用。此特定构造经常用于使用相同通用模块概念的节点模块中(在创建模块时语法略有不同,但原理相同)。没有必要使用这个构造,因为函数总是可以成为主对象的属性,但是如果所有模块正在做的是定义函数,它有时会导致更短,更紧凑的代码。

答案 1 :(得分:0)

在JavaScript中,每个函数实际上都是 Function object ,就像任何其他javascript对象一样,它可以存储属性和方法。

方法 me()只是我的快捷方式。 doThings()因为 me()隐式调用它。在您的示例中,doThings()是函数 me()的方法。

这是一个修改过的例子,希望能澄清我的意思:

var module2 = (function(){

    // private variable
    var private_var;

    // private method
    var private_method = function(){
        // ...
    }

    // this is supposed to be a shortcut for me.doThings
    var me = function (options) {
      // Anything can happen here. For example you can treat me as a method to define a private var within the module:
      private_var = options;
    }

    me.doThings = function(options) {
       // do something
       console.log('do something', private_var);
    } 

    me.doMoreThings = function(options) {
       // do even more of something
       console.log('do even more of something', private_var);
    } 

    // returns a function instead of an object
    return me;      

 })();

module2('Hello World');
module2.doThings(); // 'do something','Hello world'
module2.doMoreThings(); // 'do even more of something','Hello world'

module2('Hello Universe');
module2.doThings(); // 'do something','Hello Universe'
module2.doMoreThings(); // 'do even more of something','Hello Universe'