Паттерн модуль
Паттерн "Модуль" базируется на замыканиях и состоит из двух компонентов: внешняя функция, которая определяет лексическое окружение, и возвращаемый набор внутренних функций, которые имеют доступ к этому окружению.
Определим простейший модуль:
let foo = (function(){
let obj = {greeting: "hello"};
return {
display: function(){
console.log(obj.greeting);
}
}
})();
// Result: 9
foo.display();
Здесь определена переменная foo
, которая представляет результат анонимной функции. Внутри подобной функции определен объект obj
с некоторыми данными.
Сама анонимная функция возвращает объект, который определяет функцию display
. Возвращаемый объект определяет общедоступый API
, через который мы можем обращаться к данным, определенным внутри модуля.
return {
display: function(){
console.log(obj.greeting);
}
}
Такая конструкция позволяет закрыть некоторый набор данных в рамках функции-модуля и опосредовать доступ к ним через определенный API
- возвращаемые внутренние функции.
Рассмотрим чуть более сложный пример:
let calculator = (function(){
let data = { number: 0};
return {
sum: function(n){
data.number += n;
},
subtract: function(n){
data.number -= n;
},
display: function(){
console.log("Result: ", data.number);
}
}
})();
calculator.sum(10);
calculator.sum(3);
// Result: 13
calculator.display();
calculator.subtract(4);
calculator.subtract(4);
// Result: 9
calculator.display();
Данный модуль представляет примитивный калькулятор, который выполняет три операции: сложение, вычитание и вывод результата. Все данные инкапсулированы в объекте data
, который хранит результат операции. Все операции представлены тремя возвращаемыми функциями: sum
, subtract
и display
. Через эти функции мы можем управлять результатом калькулятора извне.