Object.freeze() в JavaScript
- Что делает Object.freeze()
- Синтаксис
- Изменение свойств
- Добавление и удаление свойств
- Метод возвращает тот же объект
- Поверхностная заморозка
- Когда использовать
- Итого
Object.freeze() замораживает объект: после этого нельзя изменить его свойства, добавить новые или удалить существующие.
let settings = {
theme: 'dark',
fontSize: 16,
};
Object.freeze(settings);
Такой объект остается доступным для чтения, но менять его уже нельзя.
Что делает Object.freeze()
После вызова Object.freeze() объект становится неизменяемым на верхнем уровне.
let user = {
name: 'Анна',
age: 28,
};
Object.freeze(user);
console.log(user.name); // Анна
Читать свойства можно как обычно. Ограничение касается изменения объекта.
Синтаксис
Object.freeze(object);
object - объект, который нужно заморозить.
let frozenUser = Object.freeze(user);
Метод возвращает замороженный объект.
Изменение свойств
Если попробовать изменить свойство замороженного объекта, значение не изменится.
let settings = {
theme: 'dark',
};
Object.freeze(settings);
settings.theme = 'light';
console.log(settings.theme); // dark
В строгом режиме такая попытка вызовет ошибку TypeError.
'use strict';
let settings = Object.freeze({
theme: 'dark',
});
settings.theme = 'light'; // TypeError
Поэтому лучше не рассчитывать на то, что изменение просто “не сработает”. Если объект заморожен, его нужно считать неизменяемым.
Добавление и удаление свойств
Object.freeze() запрещает не только менять существующие свойства, но и добавлять новые.
let user = {
name: 'Анна',
};
Object.freeze(user);
user.age = 28;
console.log(user); // { name: 'Анна' }
Удалить свойство тоже не получится.
delete user.name;
console.log(user.name); // Анна
Если код работает в строгом режиме, добавление и удаление свойств у замороженного объекта также приведет к ошибке.
Метод возвращает тот же объект
Object.freeze() не создает копию объекта.
let settings = {
theme: 'dark',
};
let frozenSettings = Object.freeze(settings);
console.log(frozenSettings === settings); // true
В переменных settings и frozenSettings лежит ссылка на один и тот же объект.
Поверхностная заморозка
Важный нюанс: Object.freeze() замораживает только сам объект, но не вложенные объекты.
let user = {
name: 'Анна',
address: {
city: 'Москва',
},
};
Object.freeze(user);
user.address.city = 'Казань';
console.log(user.address.city); // Казань
Свойство address нельзя заменить целиком, но объект внутри address остался изменяемым.
user.address = {
city: 'Самара',
};
console.log(user.address.city); // Казань
Если нужно заморозить вложенные объекты, их нужно замораживать отдельно.
Когда использовать
Object.freeze() полезен, когда объект должен быть набором постоянных значений.
const roles = Object.freeze({
admin: 'admin',
user: 'user',
guest: 'guest',
});
Такой объект удобно использовать как список доступных вариантов, который не должен случайно измениться во время работы программы.
Для обычных данных, которые нужно часто обновлять, Object.freeze() обычно не нужен.
Итого
Object.freeze()запрещает менять, добавлять и удалять свойства объекта.- Читать свойства замороженного объекта можно.
- Метод возвращает тот же объект, а не копию.
- В строгом режиме попытка изменить замороженный объект вызовет
TypeError. - Заморозка поверхностная: вложенные объекты остаются изменяемыми.