Javascript - 模块模式差异

标签 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

最佳答案

第一个是单例——你当然可以克隆它,但首先会很尴尬,而且不会复制私有(private)变量:所有克隆对象的所有方法仍然有效使用相同的 var counter。这就是为什么它适合做类似服务的东西。

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

关于Javascript - 模块模式差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22767044/

相关文章:

javascript - 正则表达式,替换html标签之间的特定字母

javascript - iframe引用错误: $ is not defined

c# - 如何识别JavaScript方法(函数)

javascript - 返回语句javascript

javascript - 使用 SQLite(在服务器上)和纯 JavaScript(在浏览器中)有哪些不同的方法?

javascript - 通过原型(prototype)调用方法与直接在 JavaScript 中调用方法

javascript - 需要 JavaScript 和从数组创建 html 表的帮助

javascript - 自定义 jQuery 选择框

javascript - 在完成之前的相同 Ajax 请求之前,不要发送 Ajax 请求

javascript - 如何在运行时重新加载所需的模块?