Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

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

Короткий ответ

Object.freeze() запрещает добавлять, менять и удалять свойства. Попытки изменения игнорируются:

const config = Object.freeze({ apiUrl: '/api', retries: 3 });
config.retries = 10;
 
console.log(config.retries);
console.log(Object.isFrozen(config));

Результат:

3
true

Вложенные объекты

Заморозка поверхностная: вложенные объекты остаются изменяемыми. Заморозьте их рекурсивной функцией:

const deepFreeze = (object) => {
  for (const value of Object.values(object)) {
    if (typeof value === 'object' && value !== null) deepFreeze(value);
  }
  return Object.freeze(object);
};
 
const config = deepFreeze({ db: { host: 'localhost' } });
config.db.host = 'example.com';
 
console.log(config.db.host);

Результат:

localhost

Частая ошибка

const запрещает только присвоить переменной новое значение. Сам объект менять можно:

const user = { name: 'Anna' };
user.name = 'Oleg';
 
console.log(user.name);

Результат:

Oleg

Функции из этого ответа

  • Object.freeze — Запрещает любые изменения объекта.
  • structuredClone — Создаёт глубокую копию объекта со всеми вложенными данными.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.