Object.isSealed() проверяет, запечатан ли объект.
Сам метод ничего не меняет. Он только отвечает на вопрос: находится ли объект в состоянии seal.
Синтаксис
Object.isSealed(obj)
obj - значение, состояние которого нужно проверить.
Что делает Object.isSealed()
Если объект запечатан, метод вернёт true.
const user = { name: "Anna" };
Object.seal(user);
console.log(Object.isSealed(user)); // true
Если объект не запечатан, результат будет false.
const user = { name: "Anna" };
console.log(Object.isSealed(user)); // false
Что возвращает Object.isSealed()
Object.isSealed() всегда возвращает булево значение:
true, если объект запечатанfalse, если нет
const user = { name: "Anna" };
console.log(Object.isSealed(user)); // false
Object.seal(user);
console.log(Object.isSealed(user)); // true
Что значит “объект запечатан”
Для запечатанного объекта:
- нельзя добавлять новые свойства
- нельзя удалять существующие свойства
- нельзя менять конфигурацию свойств
Но значения существующих свойств при этом ещё могут изменяться.
Именно это состояние и проверяет Object.isSealed().
Object.isSealed() и Object.seal()
Эти методы связаны напрямую:
Object.seal()переводит объект в запечатанное состояниеObject.isSealed()проверяет, находится ли объект в этом состоянии
const config = { version: 1 };
console.log(Object.isSealed(config)); // false
Object.seal(config);
console.log(Object.isSealed(config)); // true
Object.isSealed() ничего не запечатывает
Это важный момент.
const user = { name: "Anna" };
Object.isSealed(user);
user.age = 25;
console.log(user.age); // 25
Вызов Object.isSealed() сам по себе ничего не меняет.
Object.isSealed() и Object.isFrozen()
Эти методы похожи, но проверяют разное состояние.
const user = { name: "Anna" };
Object.seal(user);
console.log(Object.isSealed(user)); // true
console.log(Object.isFrozen(user)); // false
Запечатанный объект ещё не обязательно заморожен.
freeze() строже, чем seal().
Object.isSealed() и Object.isExtensible()
Если объект запечатан, расширять его уже нельзя.
const user = { name: "Anna" };
Object.seal(user);
console.log(Object.isSealed(user)); // true
console.log(Object.isExtensible(user)); // false
Но одного isExtensible() === false ещё недостаточно, чтобы объект считался запечатанным.
Значения свойств всё ещё могут меняться
Это одно из главных отличий от заморозки.
const user = { name: "Anna" };
Object.seal(user);
user.name = "Ivan";
console.log(user.name); // "Ivan"
Поэтому Object.isSealed(user) === true ещё не означает полную неизменяемость объекта.
Массивы и Object.isSealed()
Массив тоже является объектом, поэтому метод работает и с ним.
const numbers = [1, 2, 3];
console.log(Object.isSealed(numbers)); // false
Object.seal(numbers);
console.log(Object.isSealed(numbers)); // true
Это удобно, если нужно проверить, можно ли ещё расширять массив.
Проверка работает поверхностно
Как и Object.seal(), метод относится только к самому объекту, а не ко всей вложенной структуре.
const user = {
name: "Anna",
address: {
city: "Moscow",
},
};
Object.seal(user);
console.log(Object.isSealed(user)); // true
console.log(Object.isSealed(user.address)); // false
Верхний объект запечатан, но вложенный address остался обычным.
Примитивы
Для примитивов метод возвращает true.
console.log(Object.isSealed(123)); // true
console.log(Object.isSealed("hello")); // true
console.log(Object.isSealed(null)); // true
console.log(Object.isSealed(undefined)); // true
Это может выглядеть неожиданно, но такие значения и так нельзя расширять как объекты.
Не только после Object.seal()
Обычно запечатанное состояние получают через Object.seal(), но технически объект может считаться запечатанным и без прямого вызова этого метода.
Например, если:
- объект уже нельзя расширять
- все его собственные свойства неконфигурируемые
Для обычной практики достаточно помнить: чаще всего true здесь появляется после Object.seal().
Когда это полезно
Object.isSealed() удобно использовать, когда:
- нужно проверить, зафиксирована ли структура объекта
- вы работаете с конфигами или объектами, которые не должны расширяться
- нужно явно убедиться, что
Object.seal()уже был применён
Пример:
const settings = Object.seal({
theme: "dark",
});
if (Object.isSealed(settings)) {
console.log("Структура настроек запечатана");
}
Object.isSealed() не меняет объект
Метод только возвращает результат проверки.
const user = { name: "Anna" };
const result = Object.isSealed(user);
console.log(result); // false
console.log(user); // { name: "Anna" }
Частые ошибки
Думать, что Object.isSealed() сам запечатывает объект
const user = { name: "Anna" };
Object.isSealed(user);
user.age = 25;
console.log(user.age); // 25
Метод только проверяет состояние.
Считать, что sealed означает полную неизменяемость
const user = { name: "Anna" };
Object.seal(user);
user.name = "Ivan";
console.log(user.name); // "Ivan"
Значения существующих свойств ещё можно менять.
Путать Object.isSealed() и Object.isFrozen()
const user = { name: "Anna" };
Object.seal(user);
console.log(Object.isSealed(user)); // true
console.log(Object.isFrozen(user)); // false
Запечатанный объект не всегда заморожен.
Быстрая памятка
Object.isSealed()проверяет, запечатан ли объект- метод возвращает
trueилиfalse - сам объект метод не изменяет
- запечатанный объект нельзя расширять или чистить, но его значения ещё могут меняться
- обычно
trueздесь появляется послеObject.seal()
Коротко
Object.isSealed() - это способ проверить, зафиксирована ли структура объекта. Главное, что стоит запомнить: метод ничего не меняет сам, а только подтверждает, что объект уже нельзя расширять или очищать, хотя его существующие свойства ещё могут оставаться изменяемыми.