Я пытаюсь понять, как работают public` свойства в (Revealing) Module Pattern. Преимущество, на которое указал Карл Дэнли "Шаблон раскрывающегося модуля"< /а> это:
Явно определенные общедоступные методы и переменные, которые повышают читабельность.
Давайте посмотрим на этот код (fiddle):
var a = function() {
var _private = null;
var _public = null;
function init() {
_private = 'private';
_public = 'public';
}
function getPrivate() {
return _private;
}
return {
_public : _public,
init : init,
getPrivate : getPrivate,
}
}();
a.init();
console.log( a._public ); // null
console.log( a.getPrivate() ); // "private"
Он возвращает null
при вызове a._public
. Теперь я могу манипулировать этим общедоступным свойством, например a._public = 'public';
. Но я не могу изменить его из своего объекта. Или, по крайней мере, эти изменения не проходят. Я как бы ожидал, что это будет "public"
, так как он был обновлен методом init
раньше.
Означает ли это, что у меня не может быть методов, обрабатывающих public свойства? Тогда свойства public в этом шаблоне не имеют большого смысла, верно? Я также безуспешно пробовал это (fiddle):
return {
_pubic : _public,
init2 : function() {
_public = 'public';
}
}
И последнее, но не менее важное: у меня есть вопрос относительно всего заявления return
. Почему нельзя просто использовать return this;
, чтобы сделать все общедоступным? Поскольку this
должен быть контекстом самовызываемой функции, не должна ли она просто возвращать в ней все? Почему я должен создавать еще один объект, который возвращается? В этой скрипте он возвращает объект window
.