Ответ
Да, сталкивался с этим паттерном. Revealing Constructor позволяет создавать объекты, приватное состояние которых можно настроить только в момент создания, передав в конструктор функцию-исполнитель (executor). Это обеспечивает строгую инкапсуляцию.
Классический пример — реализация, похожая на нативный Promise:
class ImmutableLogger {
#logs = []; // Приватное поле
constructor(executor) {
// Исполнитель получает контролируемый интерфейс для работы
executor({
log: (message) => {
this.#logs.push(`${new Date().toISOString()}: ${message}`);
},
getLogs: () => [...this.#logs] // Возвращаем копию
});
}
}
// Использование:
const logger = new ImmutableLogger(({ log }) => {
log('Application started');
log('User logged in');
});
// Прямой доступ к `#logs` извне невозможен
Где это применяется:
- Встроенные API: Сам
Promiseиспользует этот паттерн — функцииresolveиrejectдоступны только исполнителю, переданному в конструктор. - Библиотеки: Некоторые библиотеки для создания безопасных или иммутабельных структур данных.
- Мои проекты: Использовал подобный подход при написании кастомного Event Emitter, где нужно было дать возможность инициализировать слушатели только один раз при создании.