Шаблон Module изначально был определен как способ обеспечить как частную, так и публичную инкапсуляцию для классов в традиционной разработке программного обеспечения.
При работе с шаблоном Module нам может быть полезно определить простой шаблон, который мы используем для начала работы с ним. Вот тот, который охватывает пространство имен, публичные и частные переменные.
В JavaScript шаблон Module используется для дальнейшей эмуляции концепции классов таким образом, что мы можем включать как открытые / закрытые методы, так и переменные в один объект, таким образом защищая определенные части от глобальной области видимости. Это приводит к уменьшению вероятности конфликта имен наших функций с другими функциями, определенными в дополнительных сценариях на странице.
var myNamespace = (function () {
var myPrivateVar, myPrivateMethod;
// A private counter variable
myPrivateVar = 0;
// A private function which logs any arguments
myPrivateMethod = function( foo ) {
console.log( foo );
};
return {
// A public variable
myPublicVar: "foo",
// A public function utilizing privates
myPublicFunction: function( bar ) {
// Increment our private counter
myPrivateVar++;
// Call our private method using bar
myPrivateMethod( bar );
}
};
})();
преимущества
почему шаблон модуля является хорошим выбором? Начнем с того, что для разработчиков, которые исходят из объектно-ориентированного фона, он намного чище, чем идея истинной инкапсуляции, по крайней мере с точки зрения JavaScript.
Во-вторых, он поддерживает личные данные - поэтому в шаблоне Module открытые части нашего кода могут касаться закрытых частей, однако внешний мир не может касаться закрытых частей класса.
Недостатки
Недостатки шаблона Module заключаются в том, что, поскольку мы по-разному обращаемся как к публичным, так и к закрытым членам, когда мы хотим изменить видимость, мы фактически должны вносить изменения в каждое место, где использовался член.
Мы также не можем получить доступ к закрытым членам в методах, которые добавляются к объекту позже . Тем не менее, во многих случаях шаблон модуля по-прежнему весьма полезен и при правильном использовании, безусловно, может улучшить структуру нашего приложения.
Выявление шаблона модуля
Теперь, когда мы немного более знакомы с шаблоном модуля, давайте взглянем на слегка улучшенную версию - шаблон модуля выявления Кристиана Хайльмана.
Паттерн «Модуль раскрытия» появился, когда Хейлманн был разочарован тем, что ему пришлось повторять имя основного объекта, когда мы хотели вызвать один открытый метод из другого или получить доступ к публичным переменным. Ему также не нравилось требование к модулю шаблона о необходимости переключения возражать против буквального обозначения вещей, которые он хотел обнародовать.
Результатом его усилий стал обновленный шаблон, в котором мы просто определяем все наши функции и переменные в частной области и возвращаем анонимный объект с указателями на частную функциональность, которую мы хотели раскрыть как открытую.
Пример использования шаблона «Модуль раскрытия» можно найти ниже.
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
преимущества
Этот шаблон позволяет синтаксису наших сценариев быть более согласованным. Это также делает более ясным в конце модуля, какие из наших функций и переменных могут быть доступны публично, что облегчает читабельность.
Недостатки
Недостатком этого шаблона является то, что если частная функция ссылается на открытую функцию, эта открытая функция не может быть переопределена, если требуется исправление. Это связано с тем, что частная функция будет продолжать ссылаться на частную реализацию, и шаблон не применяется к открытым членам, только к функциям.
Члены открытого объекта, которые ссылаются на закрытые переменные, также подчиняются примечаниям правила no-patch выше.