Шаблон модуля Javascript и новое ключевое слово

Я понимаю основы паттерна модуля и его использования замыкания, позволяющего использовать частные члены, НО я не могу понять, почему приведенный ниже код делает то, что он делает:

var Calculator = function() {
    var priv = 0;

    return {
        changePriv: function() { priv++;},
        printPriv: function() { console.log(priv);}
    }
}

var myCalc = Calculator();
myCalc.printPriv();
myCalc.changePriv();
myCalc.printPriv();

var myOtherCalc = Calculator();
myCalc.printPriv();

Вывод консоли:

0
1
1

Таким образом, преднамеренно опуская здесь ключевое слово new, первый вызов устанавливает myCalcв объект Calculator. Он начинается со значения priv, равного 0, затем увеличивается, а затем выводит новое значение priv, равное 1.

Но а) ПОЧЕМУ следующий вызов Calculator()в конечном итоге возвращает ссылку на ОДИН и тот же объект (о чем свидетельствует вторая «1»)? Я знаю, что могу использовать здесь newи избежать этого, но не понимаю, почему я должен это делать.Разве эта функция не использует синтаксис литерала объекта, чтобы по существу создать новый объект, а затем вернуть его? б) Поскольку он, кажется, использует то же самое пространство стека функций (правильно ли думать об этом в JS?), почему он не обнуляет переменную privв процессе перед вернуть ссылку на тот же объект?

РЕДАКТИРОВАТЬ: Исправлена ​​неаккуратная/глупая ошибка (спасибо scessor), которая теперь выводит новый/отдельный объект калькулятора даже без использования ключевого слова new. Итак, это проясняет а) и б). Мой результирующий вопрос был бы таким: «Имеет ли значение, использую ли я newили нет при вызове конструктора шаблона модуля. Ответ, я думаю, не имеет значения (?). (Джозеф: см. http://jsfiddle.net/MvMvy/5/... оператор instanceof просто не работает с шаблоном модуля в любом случае.)

8
задан 18 April 2012 в 19:20
поделиться