JavaScript метод Object.seal()

Определение и применение

JavaScript метод seal() делает объект нерасширяемым (предотвращает добавление новых собственных (неунаследованных) свойств), а также устанавливает все его собственные свойства как ненастраиваемые (предотвращает их удаление и изменение дескриптора).

Под ненастраиваемыми свойствами стоит понимать те, атрибут configurable которых имеет значение false, в этом случае удаление такого свойства из содержащего его объекта, а большинство последующих изменений дескриптора запрещено. Атрибуты в свою очередь описываются дескрипторами свойств – это обычные объекты JavaScript, которые описывают атрибуты и значение свойства. Подробную информацию о дескрипторах свойств и атрибутах вы можете получить в описании метода defineProperty(), который позволяет определить новое или изменить существующее свойство объекта, описывая его дескрипторами.

Если в цепочке прототипов объекта на котором был вызван метод seal() содержится расширяемый и настраиваемый объект, то в этом случае остается возможность добавлять и удалять наследуемые им свойства.

Метод seal() не изменяет значение атрибута writable собственных (неунаследованных) свойств объекта, благодаря чему остается возможность их изменения. Это является его основным отличием от метода freeze().

Чтобы проверить является ли объект нерасширяемым и с недоступными для настройки свойствами вы можете воспользоваться методом isSealed().

Сравнение подобных методов

Object: справочные сведения
Метод Объект становится нерасширяемым Атрибут configurable для каждого собственного (неунаследованного) свойства имеет значение false Атрибут writable для каждого собственного свойства данных имеет значение false
preventExtensions() Да Нет Нет
seal() Да Да Нет
freeze() Да Да Да

У ненастраиваемого свойства данных с writable: true по-прежнему можно менять значение и переключить writable в false. Вложенные объекты не запечатываются.

Поддержка браузерами

Спецификация: ecma262

Поддерживается во всех основных браузерах с 2015 года.

Показать браузеры
Совместимостьjavascript.builtins.Object.seal
ВозможностьКомпьютерыМобильные
ChromeEdgeFirefoxOperaSafariChrome AndroidFirefox for AndroidOpera AndroidSafari on iOSSamsung BrowserWebView AndroidWebView on iOS
seal✓6✓12✓4✓12✓5.1✓18✓4✓12✓5✓1.0✓4.4✓5

поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31

JavaScript синтаксис

JavaScript
Object.seal( obj );

Спецификация

ECMAScript: Object.seal()

Значения параметров

Object: справочные сведения
Параметр Описание
obj Целевой объект, который "запечатывается". Обязательное значение.

Исключения

Object: справочные сведения
Тип исключения Описание
TypeError Примитивы, включая null и undefined, возвращаются без изменений. Операции с объектом могут выбросить TypeError, например при нарушении ограничений прокси.

Примеры, попробуйте сами

В примере «Запрет удаления при доступной записи» показан результат вызова метода.

Запрет удаления при доступной записи

Измените свойства исходного объекта и сравните результат до и после вызова метода.

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="UTF-8" />
    <title>Запрет удаления при доступной записи</title>
  </head>
  <body>
    <p>Результат выполнения выводится в консоль.</p>
  </body>
</html>
main.js
JavaScript
// инициализируем переменную, содержащую объект
let obj = {
    a: 1,
    b: 2,
}

try {
    obj.c = 3
} catch (error) {
    console.log(error.name + ': ' + error.message) // Показываем ошибку и продолжаем сравнение.
} // добавляем новое свойство в объект

// "запечатываем" объект
try {
    Object.seal(obj)
} catch (error) {
    console.log(error.name + ': ' + error.message) // Показываем ошибку и продолжаем сравнение.
}

try {
    console.log(obj)
} catch (error) {
    console.log(error.name + ': ' + error.message) // Показываем ошибку и продолжаем сравнение.
} // {a: 1, b: 2, c: 3}

try {
    delete obj.c
} catch (error) {
    console.log(error.name + ': ' + error.message) // Показываем ошибку и продолжаем сравнение.
} // пытаемся удалить свойство (false)
try {
    obj.c = 100
} catch (error) {
    console.log(error.name + ': ' + error.message) // Показываем ошибку и продолжаем сравнение.
} // изменяем значение свойства
try {
    obj.d = 4
} catch (error) {
    console.log(error.name + ': ' + error.message) // Показываем ошибку и продолжаем сравнение.
} // пытаемся добавить новое свойство

try {
    console.log(obj)
} catch (error) {
    console.log(error.name + ': ' + error.message) // Показываем ошибку и продолжаем сравнение.
} // {a: 1, b: 2, c: 100}

// пытаемся изменить в объекте свойство данных
try {
    Object.defineProperty(obj, 'c', {
        // устанавливаем, что удаление свойства допускается, а также допускается изменение дескриптора этого свойства
        configurable: true, // TypeError
    })
} catch (error) {
    console.log(error.name + ': ' + error.message) // Показываем ошибку и продолжаем сравнение.
}

В этом примере мы инициализировали переменную, содержащую объект, и с помощью метода seal() мы "запечатали" объект. После этого мы пытаемся удалить, изменить, добавить новое свойство, или изменить дескриптор, в результате чего все наши попытки заканчиваются неудачей, за исключением изменения значения свойства объекта, оно было произведено.