Шаблон 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 выше.