Я понимаю основы паттерна модуля и его использование закрытия, позволяющего использовать частные члены, НО я не могу понять, почему приведенный ниже код делает то, что он делает:
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 просто не работает с шаблоном модуля в любом случае.)
new
). ФункцияCalculator
явно возвращает объект, поэтому вызов ее с помощьюnew
не имеет никакого значения для того, что она возвращает. - person RobG   schedule 18.04.2012