PassFront
  1. PassFront
  2. База знаний
  3. Объекты и прототипы

Как создать иммутабельный объект?

Объекты и прототипы

Иммутабельный (неизменяемый) объект создают через `Object.freeze` — оно запрещает добавлять, удалять и изменять свойства. Для вложенности нужна глубокая заморозка.

Object.freeze

const config = Object.freeze({ apiUrl: '/api', timeout: 5000 });

config.timeout = 1000;   // молча игнорируется (ошибка в strict)
config.newField = 1;     // не добавится
delete config.apiUrl;    // не удалится

Object.isFrozen(config); // true

Freeze поверхностный

Вложенные объекты остаются изменяемыми:

const obj = Object.freeze({ nested: { x: 1 } });
obj.nested.x = 99; // сработает! nested не заморожен

Глубокая заморозка

function deepFreeze(obj) {
  Object.keys(obj).forEach((key) => {
    if (typeof obj[key] === 'object' && obj[key] !== null) {
      deepFreeze(obj[key]);
    }
  });
  return Object.freeze(obj);
}

Другие способы

  • Object.seal — запрещает добавлять/удалять, но разрешает менять существующие.
  • `const` — защищает только ссылку, не содержимое.
  • Иммутабельные обновления — не мутировать, а создавать новый объект ({...obj, x: 1}), подход React/Redux.

Коротко для собеседования

Неизменяемый объект — Object.freeze (запрещает менять/добавлять/удалять свойства), но поверхностно — вложенность нужно замораживать рекурсивно (deepFreeze). Object.seal мягче (только запрет структуры). В React/Redux чаще не мутируют, а создают новый объект.

Другие вопросы раздела