JavaScript метод Object.seal()
Определение и применение
JavaScript метод seal() делает объект нерасширяемым (предотвращает добавление новых собственных
(неунаследованных) свойств), а также устанавливает все его собственные свойства как ненастраиваемые (предотвращает их
удаление и изменение дескриптора).
Под ненастраиваемыми свойствами стоит понимать те, атрибут configurable которых имеет значение
false, в этом случае удаление такого свойства из содержащего его объекта, а большинство последующих
изменений дескриптора запрещено. Атрибуты в свою очередь описываются дескрипторами свойств – это обычные
объекты JavaScript, которые описывают атрибуты и значение свойства. Подробную информацию о дескрипторах
свойств и атрибутах вы можете получить в описании метода
defineProperty(), который позволяет определить новое или изменить существующее свойство объекта, описывая его дескрипторами.
Если в цепочке прототипов объекта на котором был вызван метод seal() содержится расширяемый и
настраиваемый объект, то в этом случае остается возможность добавлять и удалять наследуемые им свойства.
Метод seal() не изменяет значение атрибута writable собственных (неунаследованных) свойств
объекта, благодаря чему остается возможность их изменения. Это является его основным отличием от метода
freeze().
Чтобы проверить является ли объект нерасширяемым и с недоступными для настройки свойствами вы можете воспользоваться
методом
isSealed().
Сравнение подобных методов
| Метод | Объект становится нерасширяемым |
Атрибут configurable для каждого собственного (неунаследованного) свойства имеет значение
false
|
Атрибут writable для каждого собственного свойства данных имеет значение
false
|
|---|---|---|---|
preventExtensions()
|
Да | Нет | Нет |
seal() |
Да | Да | Нет |
freeze()
|
Да | Да | Да |
У ненастраиваемого свойства данных с writable: true по-прежнему можно менять значение и переключить
writable в false. Вложенные объекты не запечатываются.
Поддержка браузерами
Спецификация: ecma262
Поддерживается во всех основных браузерах с 2015 года.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
seal | 6 | 12 | 4 | 12 | 5.1 | 18 | 4 | 12 | 5 | 1.0 | 4.4 | 5 |
поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31
JavaScript синтаксис
Object.seal( obj );
Спецификация
Значения параметров
| Параметр | Описание |
|---|---|
obj |
Целевой объект, который "запечатывается". Обязательное значение. |
Исключения
| Тип исключения | Описание |
|---|---|
TypeError |
Примитивы, включая null и undefined, возвращаются без изменений. Операции с объектом
могут выбросить TypeError, например при нарушении ограничений прокси.
|
Примеры, попробуйте сами
В примере «Запрет удаления при доступной записи» показан результат вызова метода.
Запрет удаления при доступной записи
Измените свойства исходного объекта и сравните результат до и после вызова метода.
index.html
<html lang="ru">
<head>
<meta charset="UTF-8" />
<title>Запрет удаления при доступной записи</title>
</head>
<body>
<p>Результат выполнения выводится в консоль.</p>
</body>
</html>
main.js
// инициализируем переменную, содержащую объект
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() мы
"запечатали" объект. После этого мы пытаемся удалить, изменить, добавить новое свойство, или изменить дескриптор, в
результате чего все наши попытки заканчиваются неудачей, за исключением изменения значения свойства объекта, оно было
произведено.