Инкапсуляцияесть ни что иное, как реализация приватности. В JavaScript подобная концепция реализуется благодаря функциям и их областям видимости.
// Функция конструктор
var Person = function(name) {
// Приватная функция
var log = function(message) {
console.log(message);
};
// Публичное свойство
this.name = name;
// Публичный метод
this.logger = function(message) {
log('Public ' + message);
};
};
Что не так с инкапсуляцией в JavaScript? Всё просто. В примере приведённом выше отсутствует возможность явно обозначить приватность, как в других языках программирования с помощью ключевых словprivate
,protected
иpublic
(пример с PHP). Естественно, подобная проблема достаточно просто решается с помощью тех же самых функций — создаётся ещё одна обёртка над кодом в виде самовызывающейся анонимной функции, например, при использованиипаттерна “модуль”:
var Peron = (function() {
// Приватная функция
var log = function(message) {
console.log(message);
};
var Person = function(name) {
// Публичное свойство
this.name = name;
};
// Публичный метод
Person.prototype.logger = function(message) {
log('Public ' + message);
};
// Экспорт публичной функции
return Person;
})();
С релизом стандарта ES2015 подобная проблема приватности была частично решена добавлениемблочных областей видимостидля переменных, в результате чего чистые функции, работающие только для данного конкретного конструктора можно вынести в отдельный модуль и запрашивать по необходимости, не опасаясь того, что кто-то их перезапишет. Но чистые функции лишь вершина айсберга и про некоторые способы организации приватности при работе с классами в JavaScript можно прочитать вэтой статье.
Онлайн курс по React JS в Киеве | Frontend, обучение, уроки, ментор - ReactWarriors