Как сделать объект неизменяемым
Короткий ответ
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 — Создаёт глубокую копию объекта со всеми вложенными данными.