Использовал ли паттерн Revealing Constructor в JavaScript/Node.js?

«Использовал ли паттерн Revealing Constructor в JavaScript/Node.js?» — вопрос из категории Паттерны, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, сталкивался с этим паттерном. 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` извне невозможен

Где это применяется:

  1. Встроенные API: Сам Promise использует этот паттерн — функции resolve и reject доступны только исполнителю, переданному в конструктор.
  2. Библиотеки: Некоторые библиотеки для создания безопасных или иммутабельных структур данных.
  3. Мои проекты: Использовал подобный подход при написании кастомного Event Emitter, где нужно было дать возможность инициализировать слушатели только один раз при создании.