JavaScript метод seal()
JavaScript ObjectОпределение и применение
JavaScript метод seal() делает объект нерасширяемым (предотвращает добавление новых собственных (неунаследованных) свойств), а также устанавливает все его собственные свойства как ненастраиваемые (предотвращает их удаление и изменение дескриптора).
Обратите внимание на то, что действие этого метода необратимо, так как нерасширяемый объект с ненастраиваемыми свойствами нельзя вновь сделать расширяемым объектом.
Под ненастраиваемыми свойствами стоит понимать те, атрибут configurable которых имеет значение false, в этом случае удаление такого свойства из содержащего его объекта, а также в дальнейшем изменение дескриптора этого свойства запрещается. Атрибуты в свою очередь описываются дескрипторами свойств – это обычные объекты JavaScript, которые описывают атрибуты и значение свойства. Подробную информацию о дескрипторах свойств и атрибутах вы можете получить в описании метода defineProperty(), который позволяет определить новое или изменить существующее свойство объекта, описывая его дескрипторами.
Если в цепочке прототипов объекта на котором был вызван метод seal() содержится расширяемый и настраиваемый объект, то в этом случае остается возможность добавлять и удалять наследуемые им свойства.
Метод seal() не изменяет значение атрибута writable собственных (неунаследованных) свойств объекта, благодаря чему остается возможность их изменения. Это является его основным отличием от метода freeze().
Чтобы проверить является ли объект нерасширяемым и с недоступными для настройки свойствами вы можете воспользоваться методом isSealed().
Сравнение подобных методов
Метод | Объект становится нерасширяемым | Атрибут configurable для каждого собственного (неунаследованного) свойства имеет значение false | Атрибут writable для каждого собственного (неунаследованного) свойства имеет значение false |
---|---|---|---|
preventExtensions() | Да | Нет | Нет |
seal() | Да | Да | Нет |
freeze() | Да | Да | Да |
Поддержка браузерами
Метод | Chrome | Firefox | Opera | Safari | IExplorer | Edge |
---|---|---|---|---|---|---|
seal() | 6.0 | 4.0 | 12.0 | 5.1 | 9.0 | Да |
JavaScript синтаксис:
Object.seal( obj );
Версия JavaScript
ECMAScript 5.1 (реализовано в JavaScript 1.8.5)Значения параметров
Параметр | Описание |
---|---|
obj | Целевой объект, который "запечатывается". Обязательное значение. |
Исключения
Тип исключения | Описание |
---|---|
TypeError | Возникает в том случае, если значение параметра, определяющее целевой объект не является объектом. Начиная с версии ECMAScript 6 параметр, который не является объектом будет сначала приведён к объекту. |
Пример использования
// инициализируем переменную, содержащую объект let obj = { a: 1, b: 2 }; obj.c = 3; // добавляем новое свойство в объект // "запечатываем" объект Object.seal( obj); console.log( obj ); // {a: 1, b: 2, c: 3} delete obj.c; // пытаемся удалить свойство (false) obj.c = 100; // изменяем значение свойства obj.d = 4; // пытаемся добавить новое свойство console.log( obj ); // {a: 1, b: 2, c: 100} // пытаемся изменить в объекте свойство данных Object.defineProperty( obj, "c", { // устанавливаем, что удаление свойства допускается, а также допускается изменение дескриптора этого свойства configurable: true // TypeError });
В этом примере мы инициализировали переменную, содержащую объект, и с помощью метода seal() мы "запечатали" объект. После этого мы пытаемся удалить, изменить, добавить новое свойство, или изменить дескриптор, в результате чего все наши попытки заканчиваются неудачей, за исключением изменения значения свойства объекта, оно было произведено.
JavaScript Object