Как создать иммутабельный объект?
Объекты и прототипы
Иммутабельный (неизменяемый) объект создают через `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); // trueFreeze поверхностный
Вложенные объекты остаются изменяемыми:
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 чаще не мутируют, а создают новый объект.