Javascript - 模块模式差异

时间:2014-03-31 16:28:47

标签: javascript

以下两种模式是否有任何区别?自行执行第一个有什么好处?

var testModule = (function () {
  var counter = 0;

  return {
    incrementCounter: function () {
      return counter++;
    },

    resetCounter: function () {
      console.log( "counter value prior to reset: " + counter );
      counter = 0;
    }
  };
})();

testModule.incrementCounter(); // 1

下一步:

var testModule2 = function () {
  var counter = 0;

  return {
    incrementCounter: function () {
      return counter++;
    },

    resetCounter: function () {
      console.log( "counter value prior to reset: " + counter );
      counter = 0;
    }
  }
}

var result = testModule2();
result.incrementCounter(); //1

1 个答案:

答案 0 :(得分:4)

第一个是单例 - 你可以克隆它,当然,但它会非常尴尬,首先,并且不会复制那些私有变量:所有克隆对象的所有方法仍然可以工作使用相同的var counter。这就是为什么它适合制作类似服务的东西。

第二个实际上是构造函数的变体 - 它适合基于单个模板创建多个东西。它的缺点(与经典的基于prototype的模板相比)是每次调用testModule2时,其中定义的所有函数都将重新创建。它的优点 - 私有变量,每个新对象的独立集合(注意克隆使用第一种方法创建的对象的差异)。