Вопрос по javascript – Почему шаблон модуля создает синглтон?

9

Когда я пытаюсь сделать разные экземпляры этого модуля, он не работает.

Кажется, это синглтон. Я могу иметь только один экземпляр за раз.

Какой механизм ограничивает функцию конструктора publik () только для экземпляра?

http://jsfiddle.net/AVxZR/

var Module = ( function ()
{
    var publik = function ( )
    {
    };
    publik.prototype.test;
    publik.prototype.get = function()
    {
        document.getElementById( 'a'+test ).innerHTML = test;
    };
    publik.prototype.set = function( value )
    {
         test = value;
    };
    return publik;
} ) ();

var object1 = new Module();
var object2 = new Module();

object1.set('1');
object2.set('2');


object1.get();
object2.get();

Ваш Ответ

4   ответа
1

так как вашtest переменная является глобальной переменной.

Чтобы исправить это изменениеtest вthis.test поэтому переменная прикреплена к каждому экземпляру.

4

чтобы вы могли использовать его для создания разных экземпляров. Вы можете изменить & quot; тестирование & quot; свойство быть статическим свойством, так как я изменил его для вас.

var Module = function(){}

    Module.prototype.test;
    Module.prototype.get = function()
    {
       document.getElementById( 'a'+this.test ).innerHTML = this.test;
    };
    Module.prototype.set = function( value )
    {
       this.test = value;
    }
Я использовал это раньше, но мне не нравится стиль b.c. нет заключающих скобок. CS_2013
9

который вы описали. Он используется для создания одного модуля и скрытия состояния от внешнего кода, т. Е. Вы открываете один общедоступный интерфейс, с которым может взаимодействовать внешний код, а остальные скрыты.

Это препятствует тому, чтобы другой код полагался на переменные или функции, которые вы используете внутри, так как они сломались бы, когда вы что-нибудь переименовали.

Кроме того, модуль должен быть одноэлементным; иметь несколько идентичных модулей - это все равно, что иметь два идентичных класса в вашем коде ... не имеет смысла.

Вот как должен выглядеть шаблон модуля.

var Module = (function($) {
    // the $ symbol is an imported alias

    // private variable
    var id = 0;

    // private function
    function increaseId()
    {
        return ++id;
    }

    // return public interface
    return {
        nextId: function() {
            // we have access to the private function here
            // as well as the private variable (btw)
            return increaseId();
        }
    }
}(jQuery)); // we import jQuery as a global symbol

Module.nextId(); // 1
Module.nextId(); // 2
Module.id; // undefined
Module.increaseId(); // error

Вы видите, как только.nextId() выставлено, но ни одна из других закрытых переменных / функций.

6

Длинный ответ (если я правильно понял, пожалуйста, прокомментируйте, чтобы я мог исправить):

Your Module var is a executed immediately when the script loads. (denoted by the parenthesis around the function.)()

In that module, your publik var is declared and it's left in the closure even when the function completes!

With subsequent calls, you still access that one Module that was auto-executed. And it always gets that same closure space and function scope and the same object, in short - so your publik variable is actually always the same one.

А что касается фиктивного шаблона, вы не должны использовать «новый» с одиночками. Одиночки полезны, когда вы создаете приложение, вы можете использовать свое собственное пространство имен. Возьмите, например, YUI или jQuery. Если & quot; $ & quot; (или "YUI") объект не был одноэлементным, тогда любой файл модуля jQuery инициализировал бы свой собственный "$". И вам придется использовать firstYUI.onePlugin и secondYUI.otherPlugin ... Идя по одному, у вас есть только один объект YUI и все & quot; плагины & quot; или виджеты или что-то связано внутри этого.
Похоже, фиктивный образец для меня. Это "ломает" значение ключевого слова "новый". Ты согласен? Если так, то почему люди используют это? Я явно не изобрел это. CS_2013
Да. Чтобы быть более правильным, когда вы заключаете функцию в шаблон (function () {} ()), она автоматически выполняется во время загрузки и результат помещается на его место. Таким образом, ваш скрипт в итоге выглядит как (внутренне) var Module = YourObjectWithGetAndSetMethods; И когда вы делаете var x = Module (); Вы вызываете объект, который уже создан, и, следовательно, с переменной экземпляра publik.
Таким образом, каждый раз, когда я вызываю new, это на самом деле не новый объект-функция, а один и тот же? CS_2013
Просто наткнулся на это: & quot; каждый экземпляр, созданный новым ключевым словом, связан с исходным прототипом & quot; Вот:dailyjs.com/2012/05/21/js101-prototype

Похожие вопросы