Почему шаблон модуля создает синглтон?

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

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

Какой механизм ограничивает функцию конструктора 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)

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

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

чтобы вы могли использовать его для создания разных экземпляров. Вы можете изменить & 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;
    }
 CS_201321 мая 2012 г., 21:29
Я использовал это раньше, но мне не нравится стиль b.c. нет заключающих скобок.

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

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

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

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

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() выставлено, но ни одна из других закрытых переменных / функций.

Решение Вопроса

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

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.

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

Ваш ответ на вопрос