javascript - 揭示模块模式和简单构造函数之间的区别

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

最佳答案

在你的简单示例中没有什么区别,但让我让它变得更复杂一点。

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
    }
  };

使用这个

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 模式鼓励那些懒得正确学习 this 的人不加区别地使用 javaScript 闭包。看这个post of mine比较模块模式变体之间的差异。

关于javascript - 揭示模块模式和简单构造函数之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35581704/

相关文章:

javascript - 如何使用 Revealing Module Pattern 将一个 JS 模块的公共(public)方法调用到另一个 JS 模块?

javascript - 使用显示模块模式时如何在 Eclipse 中查看大纲?

javascript - 事件流 JavaScript 阅读器如何触发页面刷新?

javascript - 计算表情符号的字符长度?

Javascript - 如何保存对 "this"的引用以使用原型(prototype)模式在命名函数回调中进行访问

javascript - Javascript 模块之间共享的全局变量

javascript - 从同一命名空间内通过其完全限定名称调用命名空间函数

javascript - JS 控制台显示错误结果

javascript - jquery this.id 不工作

javascript - 如何使用Puppeteer从iframe检索reCAPTCHA token ?