模块模式的提示

时间:2014-06-10 17:04:25

标签: javascript design-patterns

我有一些关于使用Module Pattern for JavaScript编程的问题。我已经看到了关于模式的指南,它以两种不同的方式使用它。第一个是这样的:

此方法来自CSS Tricks, Module Pattern

var s,
NewsWidget = {

  settings: {
    numArticles: 5,
    articleList: $("#article-list"),
    moreButton: $("#more-button")
  },

  init: function() {
    // kick things off
    s = this.settings;
  }

};

第二种方法,我将以不同的方式使用相同的代码。

var s,
NewsWidget = (function(){

  // Any variables or functions in here are private
  var privateVar;


  // All variables or functions in returned object become public
  return {

  settings: {
    numArticles: 5,
    articleList: $("#article-list"),
    moreButton: $("#more-button")
  },

  init: function() {
    // kick things off
    s = this.settings;
  }

  }


}());

现在看看这两个例子,我的假设是只使用后一种方法,因为由于闭包而能够使用私有变量。我对么?第一种方法不使用闭包,因此它位于全局内存范围内,不能拥有私有成员。那么为什么CSS Tricks和其他人使用第一种方法作为例子,当它似乎没有任何真正的目的时呢?

其次,我很好奇模块模式如何处理相同类型的多个对象?与用于获取任意数量的JavaScript对象的工厂模式不同,模块模式只执行一次匿名函数,因此如果我有一个名为BlogPost的模块来定义博客文章的所有属性,那么我该如何创建多个实例这个对象?

2 个答案:

答案 0 :(得分:1)

  

我的假设是只使用后一种方法,因为由于闭包能够使用私有变量..?我是对的吗?

是。如果你需要私有变量。

  

第一种方法不使用闭包,因此位于全局内存范围内,不能拥有私有成员。

请注意,即使在第二个示例中,s变量也是不必要的全局变量。

  

为什么CSS Tricks和其他人使用第一种方法作为例子,当它似乎没有任何真正的目的时?

为简单起见。当您没有局部变量时(因为您不需要它们,或者您将私有事物建模为属性),或者当作者不关心时。或者没有费心写下隐含的IEFE

  

其次,我很好奇模块模式如何处理相同类型的多个对象?

没有。模块是单身人士。但是,当您需要实例化与模块相关的对象时,它们可以将构造函数或工厂作为字段。但是,只有一个(全局)模块对象。

答案 1 :(得分:0)

您的第一个示例不是 Module Pattern ,它是一个简单的Object Literal初始值设定项。 只有第二个例子是模块模式,第一个例子没有给出定义私有成员或函数封装的可能性

引自Learning JavaScript Design Patterns,这是典型的模式(有一些变化):

  

在JavaScript中,Module模式用于进一步模拟   课程的概念,以便我们能够包括两者   因此,单个对象内的公共/私有方法和变量   将特定部件与全球范围隔离开来。这导致了什么   是减少我们的函数名称冲突的可能性   与页面上的其他脚本中定义的其他功能。

var myNamespace = (function () {

  var myPrivateVar, myPrivateMethod;

  // A private counter variable
  myPrivateVar = 0;

  // A private function which logs any arguments
  myPrivateMethod = function( foo ) {
      console.log( foo );
  };

  return {

    // A public variable
    myPublicVar: "foo",

    // A public function utilizing privates
    myPublicFunction: function( bar ) {

      // Increment our private counter
      myPrivateVar++;

      // Call our private method using bar
      myPrivateMethod( bar );

    }
  };

})();
相关问题