Создание экземпляров раскрывающегося шаблона модуля

Я пытаюсь понять, как создавать разные экземпляры раскрывающегося шаблона модуля. У меня есть блок кода ниже, и я создаю экземпляры модуля1 и модуля2 для myRevealingModule и устанавливаю их переменные имени. Но имя модуля1 перезаписывается модулем2. Как я могу иметь разные значения имени для модуля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");

person user5074177    schedule 29.02.2016    source источник
comment
Все три переменные, myRevealingModule, module1 и module2, содержат ссылки на один и тот же объект. Похоже, вы ищете здесь не модуль, а скорее конструктор, особенно когда вы говорите об экземплярах. Модули — это одноэлементные объекты.   -  person Bergi    schedule 01.03.2016
comment
Это единственный способ использовать конструктор, чтобы иметь 2 разных модуля с помощью myRevealingModule? Могу ли я создать обратные вызовы функций для модуля1 и модуля2 для установки значений имени? Спасибо!   -  person user5074177    schedule 01.03.2016
comment
Да, вам нужен конструктор или фабрика, способная создавать несколько объектов (если вы не хотите копировать свой код).   -  person Bergi    schedule 01.03.2016
comment
Я думаю, что фабрика работает на меня. Спасибо!   -  person user5074177    schedule 01.03.2016


Ответы (1)


Чтобы создать несколько экземпляров, вам нужно удалить () в конце определения, чтобы вы могли вызывать его отдельно каждый раз, когда хотите создать новый экземпляр. См. комментарии к коду в блоке ниже для трех мест, где были внесены изменения:

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() в фабричную функцию. Каждый раз, когда вы его вызываете, он создает новый экземпляр вашего объекта.

person jfriend00    schedule 06.03.2016