Learn JavaScript

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

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