【问题标题】:Creating instances of revealing module pattern创建显示模块模式的实例
【发布时间】:2016-02-29 23:07:00
【问题描述】:

我试图了解如何创建揭示模块模式的不同实例。我在下面有一个代码块,并创建了 myRevealingModule 的 module1 和 module2 实例并设置了它们的名称变量。但是 module1 的名称被 module2 覆盖。如何为模块 1 和模块 2 设置不同的名称值?我错过了什么?谢谢!

var myRevealingModule = (function(){

    var name = 'Default';

    function setName (nameVal) {
       name = nameVal;
    };

    function getName () {
       return name;
    };

    return {
        fullName: name,
        set: setName,
        get: getName
    };

}());
var module1  = myRevealingModule;
module1.set("module1 name");
var module2  = myRevealingModule;
module2.set("module2 name");

【问题讨论】:

  • 所有三个变量myRevealingModulemodule1module2 都持有对同一个对象的引用。看起来您在这里寻找的不是模块,而是构造函数,尤其是当您谈论“实例”时。模块是单例对象。
  • 只有通过 myRevealingModule 使用构造函数来拥有 2 个不同的模块吗?我可以为 module1 和 module2 创建函数回调来设置名称值吗?谢谢!
  • 是的,您需要一个能够创建多个对象的构造函数或工厂(如果您不想复制代码)。
  • 我认为工厂适合我。谢谢!

标签: javascript oop design-patterns module-pattern revealing-module-pattern


【解决方案1】:

要创建多个实例,您必须删除定义末尾的(),以便您可以在每次要创建新实例时单独调用它。请参阅下面块中的代码 cmets 了解三个地方的更改:

var myRevealingModule = (function(){

    var name = 'Default';

    function setName (nameVal) {
       name = nameVal;
    };

    function getName () {
       return name;
    };

    return {
        fullName: name,
        set: setName,
        get: getName
    };

});    // removed the () here

var module1  = myRevealingModule();    // added () here to call factory function
module1.set("module1 name");
var module2  = myRevealingModule();    // added () here to call factory function
module2.set("module2 name");

这使myRevealingModule() 成为工厂函数。每次调用它时,它都会创建对象的一个​​新实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 2018-02-24
    • 2012-12-19
    相关资源
    最近更新 更多