Как обеспечить неизменность перечислений в JavaScript?

Создание стабильных перечислений в JavaScript

Пытаюсь разобраться с созданием enum-подобных структур в JavaScript. Хочу убедиться, что значения не будут случайно изменены в процессе выполнения программы.

Вот мой текущий подход:

const app = {
  constants: {
    StatusType: {
      ACTIVE: 'active',
      INACTIVE: 'inactive', 
      PENDING: 'pending'
    }
  }
};

// Использование в коде
function checkUserStatus(userStatus) {
  if (userStatus === app.constants.StatusType.ACTIVE) {
    console.log('Пользователь активен');
  }
}

Правильно ли я понимаю, что такая структура обеспечит стабильность значений? Или существуют более надежные способы создания неизменяемых перечислений в JavaScript? Буду благодарен за советы по лучшим практикам.

Я обычно миксую несколько способов. Object.freeze работает, но можно еще глубже - через Object.seal или класс с геттерами. Недавно попробил:

class StatusType {
  static get ACTIVE() { return 'active'; }
  static get INACTIVE() { return 'inactive'; }
  static get PENDING() { return 'pending'; }
}

Так вообще ничего не переписать - только читать. Кода чуть больше, зато защита железобетонная.

Твой подход неплохой, но объект легко изменить. Лучше используй Object.freeze() для полной защиты:

const StatusType = Object.freeze({
  ACTIVE: 'active',
  INACTIVE: 'inactive',
  PENDING: 'pending'
});

Так никто не добавит новые свойства или не изменит существующие. В продакшене всегда так делаю - работает отлично.

Можно попробовать Object.defineProperty() - это даст больше контроля над свойствами. Или использовать Symbol для предотвращения перезаписи. А зачем нужна такая глубокая вложенность с app.constants? Может, проще упростить структуру?