Object.seal() запечатывает объект.
После этого у объекта нельзя:
- добавлять новые свойства
- удалять существующие свойства
- менять конфигурацию свойств
Но значения существующих свойств обычно ещё можно изменять.
Синтаксис
Object.seal(obj)
obj - объект, который нужно запечатать.
Что делает Object.seal()
Метод запрещает менять структуру объекта, но не всегда запрещает менять значения его свойств.
const user = {
name: "Anna",
};
Object.seal(user);
user.name = "Ivan";
user.age = 25;
delete user.name;
console.log(user); // { name: "Ivan" }
Здесь значение name изменилось, но новое свойство age не добавилось, а name не удалилось.
Что возвращает Object.seal()
Object.seal() возвращает тот же самый объект.
const user = { name: "Anna" };
const result = Object.seal(user);
console.log(result === user); // true
Это важно: метод не создаёт новый объект, а работает с уже существующим.
Нельзя добавлять новые свойства
const user = {
name: "Anna",
};
Object.seal(user);
user.age = 25;
console.log(user.age); // undefined
Нельзя удалять свойства
const user = {
name: "Anna",
};
Object.seal(user);
delete user.name;
console.log(user.name); // "Anna"
Обычно можно менять значения
Если свойство было writable: true, после seal() его значение обычно всё ещё можно переписать.
const settings = {
theme: "dark",
};
Object.seal(settings);
settings.theme = "light";
console.log(settings.theme); // "light"
Это одно из главных отличий seal() от freeze().
В strict mode будет ошибка
В обычном режиме попытки добавить или удалить свойства обычно просто не срабатывают.
В строгом режиме JavaScript выбросит ошибку.
"use strict";
const user = { name: "Anna" };
Object.seal(user);
// user.age = 25; // TypeError
// delete user.name; // TypeError
Object.seal() и Object.freeze()
Эти методы похожи, но freeze() строже.
Object.seal():
- запрещает добавлять новые свойства
- запрещает удалять свойства
- обычно позволяет менять значения существующих свойств
Object.freeze():
- делает всё то же самое
- дополнительно запрещает менять значения существующих свойств
Пример:
const user = { name: "Anna" };
Object.seal(user);
user.name = "Ivan";
console.log(user.name); // "Ivan"
const user = { name: "Anna" };
Object.freeze(user);
user.name = "Ivan";
console.log(user.name); // "Anna"
Object.seal() и Object.preventExtensions()
Есть ещё более мягкий вариант - Object.preventExtensions().
Он только запрещает добавлять новые свойства.
Object.seal() идёт дальше:
- запрещает добавлять свойства
- запрещает удалять свойства
- делает свойства неконфигурируемыми
То есть seal() строже, чем preventExtensions(), но мягче, чем freeze().
Как проверить, что объект запечатан
Для этого есть Object.isSealed().
const user = { name: "Anna" };
Object.seal(user);
console.log(Object.isSealed(user)); // true
Object.seal() работает поверхностно
Как и freeze(), метод защищает только верхний уровень объекта.
const user = {
name: "Anna",
address: {
city: "Moscow",
},
};
Object.seal(user);
user.address.city = "Paris";
console.log(user.address.city); // "Paris"
Сам объект user запечатан, но вложенный объект address остался обычным.
Массивы и Object.seal()
Массив тоже является объектом, поэтому метод работает и с ним.
const numbers = [1, 2, 3];
Object.seal(numbers);
numbers[0] = 10;
numbers.push(4);
console.log(numbers); // [10, 2, 3]
Изменение существующего элемента по индексу возможно, а расширение массива уже нет.
Object.seal() не делает объект константой
Это тоже важно не путать с const.
const user = { name: "Anna" };
Object.seal(user);
user.name = "Ivan";
console.log(user.name); // "Ivan"
Если нужно запретить и изменение значений тоже, нужен уже Object.freeze().
Когда это полезно
Object.seal() удобно использовать, когда:
- нужно зафиксировать структуру объекта
- важно запретить добавление и удаление свойств
- при этом значения существующих свойств ещё можно менять
Пример:
const config = Object.seal({
apiUrl: "/api",
version: 1,
});
config.version = 2;
console.log(config); // { apiUrl: "/api", version: 2 }
Частые ошибки
Думать, что Object.seal() полностью запрещает любые изменения
const user = { name: "Anna" };
Object.seal(user);
user.name = "Ivan";
console.log(user.name); // "Ivan"
Значения существующих свойств обычно всё ещё можно менять.
Путать Object.seal() и Object.freeze()
const user = { name: "Anna" };
Object.seal(user);
user.name = "Ivan";
С seal() это сработает, а с freeze() уже нет.
Считать, что запечатывание глубокое
const user = {
profile: { city: "Moscow" },
};
Object.seal(user);
user.profile.city = "Paris";
Вложенные объекты внутри всё ещё можно менять.
Быстрая памятка
Object.seal()запечатывает объект- после этого нельзя добавлять и удалять свойства
- значения существующих свойств обычно можно менять
- метод возвращает тот же самый объект
- проверить состояние можно через
Object.isSealed()
Коротко
Object.seal() - это способ зафиксировать структуру объекта без полной заморозки значений. Главное, что стоит запомнить: после seal() объект нельзя расширять или чистить, но существующие свойства часто всё ещё можно менять.