Learn JavaScript

Object.isSealed() - метод для проверки запечатанного объекта в JavaScript

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() - это способ проверить, зафиксирована ли структура объекта. Главное, что стоит запомнить: метод ничего не меняет сам, а только подтверждает, что объект уже нельзя расширять или очищать, хотя его существующие свойства ещё могут оставаться изменяемыми.