Javascript模块模式 - 差异

时间:2017-12-02 15:13:31

标签: javascript design-patterns

我知道javascript模块模式,但我使用两种类型的模块模式,并希望从架构角度了解它们之间的区别。

// PATTERN ONE
var module = (function() {
  var _privateVariable = '';

  var _privateMethod = function() {
    var _this = this;
    // private method def
    // can use _this._privateVariable
    console.log('Inside a private method!');
  };

  var publicMethod = function() {
    var _this = this;
    // public method def
    // can use _this._privateVariable
    // can call _privateMethod();
  };

  return {
    publicMethod: publicMethod
  };
})();

// PATTERN TWO
var module = (function() {
  var wrapper = {
    _privateVariable: '',

    _privateMethod: function() {
      var _this = this;
      // private method def
      // can use _this._privateVariable
      console.log('Inside a private method!');
    },

    publicMethod: function() {
      var _this = this;
      // public method def
      // can use _this._privateVariable
      // can call _privateMethod();
    },
  };

  return {
    publicMethod: wrapper.publicMethod
  };
})();

这两种模式似乎对我都做同样的事情

  1. 使用其中任何一个都有显着差异吗?
  2. 是否应该避免其中一种模式?
  3. 有没有更好的方法来使用其中任何一种?

1 个答案:

答案 0 :(得分:1)

事实上,你提到的两种模式没有区别。我看到的唯一区别是第二种模式使用wrapper作为额外的变量,可以避免。

考虑到其他情况,你可能想要返回一个复杂的对象而不是当前的对象,那么第二个模式非常有用,

例如。

var wrapper = {
_privateVariable: '',

_privateMethod: function() {
  var _this = this;
  console.log('Inside a private method!');
},

publicMethod: function() {
  var _this = this;
},

publicMethod2: function() {
  var _this = null;
},

publicMethod3: function(default) {
  var _this = default;
},
};

return {
   publicMethod: wrapper
};