揭示模块模式与简单构造函数的区别

时间:2016-02-23 15:35:52

标签: javascript revealing-module-pattern

用Google搜索但找不到合适的资源来解释使用显示模块模式和this关键字之间的区别。

使用揭示模块模式时,我可以使用以下代码:

var moduleRevealing = function() {
    var talk = function() {
      console.log("Talking....");
    };
    var walk = function() {
      console.log("Walking...");
    };
    return {
      talk: talk,
      walk: walk
    }
  };

  console.log('Module Pattern Object');
  console.log(moduleRevealing());

现在使用this关键字可以实现同样的目的:

var module = function() {
    var talk = function() {
      console.log("Talking....");
    };
    this.walk = function() {
      console.log("Walking...");
    };
    this.talk = talk;
  };
  var mod1 = new module();
  console.log('Module Object');
  console.log(mod1);

两者有何不同?我只能看到一个区别,那就是__proto;前者指向Object,而后者指向module

如果有人想要查看代码 - Fiddle

2 个答案:

答案 0 :(得分:3)

在你的简单例子中没有任何区别,但让我让它变得更复杂。

var moduleRevealing = function() {
    var talk = function() {
      console.log("Talking....");
    };
    var walk = function() {
      console.log("Walking...");
    };
    var walkAndTalk = function(){
      walk();
      talk();
    };
    return {
      talk: talk,
      walk: walk,
      walkAndTalk: walkAndTalk
    }
  };

使用this

var module = function() {
    var talk = function() {
      console.log("Talking....");
    };
    this.walk = function() {
      console.log("Walking...");
    };
    this.talk = talk;
    this.walkAndTalk = function(){
      this.walk();
      this.talk();
    }
  };

当您覆盖其方法时,这两个稍微复杂的示例现在具有非常不同的行为。

var modR = moduleRevealing();
var mod1 = new module();
modR.walk = function() {console.log('FAST Walking...");}
mod1.walk = function() {console.log('FAST Walking...");}

modR.walk(); // outputs "FAST Walking..."
modl.walk(); // outputs "FAST Walking..."

modR.walkAndTalk(); // outputs "Walking ... Talking..."
mod1.walkAndTalk(); // outputs "FAST Walking...Talking..."

请注意,即使更改了walk()的输出当您覆盖使用Revealing Module创建的实例时,依赖方法walkAndTalk()也不会选择该更改。其根本原因在于,Revealing Module模式鼓励不加思索地使用javaScript闭包来帮助那些没有费心去学习this的人。有关模块模式变体之间差异的比较,请参阅此post of mine

答案 1 :(得分:0)

在您的示例中,实际上没有区别(除了constructor等的细微差别之外)两者都返回一个对象,其中附加了每个方法的新副本。如果talkwalk属于module.prototype,则会有所不同。