Модульний модуль спочатку визначався як спосіб забезпечити як приватне, так і публічне капсулювання для занять із звичайної інженерії програмного забезпечення.
Працюючи з шаблоном Модуль, нам може бути корисно визначити простий шаблон, який ми використовуємо для початку роботи з ним. Ось один, який охоплює проміжні імена, публічні та приватні змінні.
У JavaScript модель Модуль використовується для подальшої емуляції концепції класів таким чином, що ми маємо змогу включати як публічні / приватні методи, так і змінні всередині одного об’єкта, тим самим захищаючи окремі частини від глобальної сфери. Це призводить до зменшення ймовірності того, що назви наших функцій суперечать іншим функціям, визначеним додатковими сценаріями на сторінці.
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, публічні частини нашого коду можуть торкатися приватних частин, однак зовнішній світ не в змозі торкнутися приватних частин класу.
Недоліки
Недоліками моделі модуля є те, що, коли ми отримуємо доступ до публічних та приватних членів по-різному, коли ми хочемо змінити видимість, ми насправді мусимо внести зміни до кожного місця, в якому користувач використовувався.
Ми також не можемо отримати доступ до приватних членів методами, які додаються до об'єкта пізніше . Зважаючи на це, у багатьох випадках модель Модуль все ще є досить корисною і при правильному використанні, безумовно, має потенціал для покращення структури нашого додатку.
Шаблон модуля розкриття
Тепер, коли ми трохи більше знайомі з схемою модуля, давайте подивимося на трохи вдосконалену версію - модель виявлення модуля Крістіана Хайльмана.
Модель модуля розкриття виникла, коли Хайльман був розчарований тим, що йому довелося повторювати ім'я головного об'єкта, коли ми хотіли викликати один відкритий метод з іншого або отримувати доступ до загальнодоступних змінних. заперечувати буквальне позначення речей, які він хотів оприлюднити.
Результатом його зусиль стала оновлена модель, де ми просто визначили всі наші функції та змінні у приватному масштабі та повернемо анонімний об’єкт із вказівниками до приватної функціональності, яку ми хотіли розкрити як загальнодоступну.
Приклад використання схеми модуля розкриття можна знайти нижче
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" );
Переваги
Цей візерунок дозволяє синтаксису наших сценаріїв бути більш послідовним. Це також робить більш зрозумілим в кінці модуля, до яких наших функцій та змінних може бути відкрито доступ, що полегшує читабельність.
Недоліки
Недоліком цієї шаблону є те, що якщо приватна функція посилається на публічну функцію, цю публічну функцію неможливо змінити, якщо необхідний патч. Це пояснюється тим, що приватна функція продовжуватиме посилатися на приватну реалізацію, а модель не поширюється на публічних членів, а лише на функції.
Члени публічних об'єктів, які посилаються на приватні змінні, також підпадають під дію вищезазначених правил без патчів.