я получаю основы модуля рисунка и его использование закрытия, чтобы обеспечить для частных членов, но я не могу достаточно проглотить, почему следующий код делает то, что он делает:Javascript Модуль Pattern и новое ключевое слово
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, имеет, что увеличивается, а затем выводит его новое значение 1.
priv
Но) ПОЧЕМУ следующий вызов Calculator()
в конечном итоге возвращает ссылку на тот же объект (как о чем свидетельствует второй «1»)? Я знаю, что могу использовать здесь new
и избегать этого, но не понимаю, зачем мне это нужно. Разве эта функция не использует синтаксис объектного литерала, чтобы по существу создать новый объект и затем вернуть его? b) Поскольку он, похоже, использует одно и то же пространство стека функций (это даже правильный способ думать об этом в JS?), Почему он не обнуляет переменную priv
в этом процессе, прежде чем возвращать ссылку на тот же объект?
EDIT: Исправлена неряшливая/глупая ошибка (спасибо scessor), которая теперь выводит новый/отдельный объект калькулятора даже без использования ключевого слова new
. Таким образом, это очищает a) и b). Мой итоговый вопрос был бы «Имеет ли значение, пользуюсь ли я new
или нет в вызове конструктора шаблонов модулей. Ответ: я думаю, это не имеет значения (?). (Джозеф: см. http://jsfiddle.net/MvMvy/5/ ... оператор InstanceOf просто не работает с шаблоном модуля в любом случае)
По соглашению функции, начинающиеся с заглавной буквы, зарезервированы для конструкторов (т. Е. Функций, которые предполагается вызывать с помощью 'new'). Функция «Калькулятор» явно возвращает объект, поэтому вызов его с помощью «new» не имеет никакого отношения к тому, что он возвращает. – RobG
Спасибо RobG. Это именно то, на что я надеялся получить подтверждение. – jeffersii