Object.seal() в JavaScript
- Что делает Object.seal()
- Синтаксис
- Изменение существующих свойств
- Добавление и удаление свойств
- Разница между Object.seal() и Object.freeze()
- Метод возвращает тот же объект
- Вложенные объекты
- Когда использовать
- Итого
Object.seal() запечатывает объект: после этого нельзя добавить новые свойства и нельзя удалить существующие.
let user = {
name: 'Анна',
age: 28,
};
Object.seal(user);
При этом значения существующих свойств обычно можно менять.
Что делает Object.seal()
Object.seal() фиксирует набор свойств объекта.
let user = {
name: 'Анна',
};
Object.seal(user);
user.age = 28;
console.log(user); // { name: 'Анна' }
Свойство age не добавилось, потому что объект уже запечатан.
Главная идея метода: свойства, которые уже есть, остаются на месте, а структура объекта больше не расширяется.
Синтаксис
Object.seal(object);
object - объект, который нужно запечатать.
let sealedUser = Object.seal(user);
Метод возвращает запечатанный объект.
Изменение существующих свойств
В отличие от Object.freeze(), метод Object.seal() не запрещает менять значения существующих свойств.
let settings = {
theme: 'dark',
};
Object.seal(settings);
settings.theme = 'light';
console.log(settings.theme); // light
Свойство theme уже было в объекте, поэтому его значение изменилось.
Добавление и удаление свойств
Добавить новое свойство в запечатанный объект нельзя.
let user = {
name: 'Анна',
};
Object.seal(user);
user.email = 'anna@example.com';
console.log(user.email); // undefined
Удалить существующее свойство тоже не получится.
delete user.name;
console.log(user.name); // Анна
В строгом режиме попытка добавить или удалить свойство вызовет ошибку TypeError.
'use strict';
let user = Object.seal({
name: 'Анна',
});
user.age = 28; // TypeError
Разница между Object.seal() и Object.freeze()
Object.seal() и Object.freeze() похожи, но работают по-разному.
let sealedUser = Object.seal({
name: 'Анна',
});
sealedUser.name = 'Мария';
console.log(sealedUser.name); // Мария
let frozenUser = Object.freeze({
name: 'Анна',
});
frozenUser.name = 'Мария';
console.log(frozenUser.name); // Анна
Object.seal() запрещает менять состав свойств объекта, но не запрещает менять их значения.
Object.freeze() строже: он запрещает и менять состав объекта, и изменять значения существующих свойств.
Метод возвращает тот же объект
Object.seal() не создает копию.
let user = {
name: 'Анна',
};
let sealedUser = Object.seal(user);
console.log(sealedUser === user); // true
В обеих переменных лежит ссылка на один и тот же объект.
Вложенные объекты
Object.seal() действует только на сам объект. Вложенные объекты остаются обычными объектами.
let user = {
name: 'Анна',
address: {
city: 'Москва',
},
};
Object.seal(user);
user.address.country = 'Россия';
user.address.city = 'Казань';
console.log(user.address);
// { city: 'Казань', country: 'Россия' }
Свойство address нельзя удалить или заменить новым свойством, но сам объект внутри address не был запечатан.
Когда использовать
Object.seal() полезен, когда набор свойств должен быть фиксированным, но значения могут меняться.
let formState = Object.seal({
name: '',
email: '',
isValid: false,
});
formState.name = 'Анна';
formState.isValid = true;
В таком объекте можно обновлять уже известные поля, но случайно добавить новое поле не получится.
В обычном учебном коде Object.seal() нужен нечасто, но понимать его полезно: он находится между обычным объектом и полностью замороженным объектом.
Итого
Object.seal()запрещает добавлять и удалять свойства объекта.- Значения существующих свойств обычно можно менять.
- Метод возвращает тот же объект, а не копию.
- В строгом режиме добавление и удаление свойств вызовет
TypeError. Object.freeze()строже: он запрещает еще и изменение значений.- Вложенные объекты не запечатываются автоматически.