JavaScript метод seal()

JavaScript Object

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

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


Обратите внимание на то, что действие этого метода необратимо, так как нерасширяемый объект с ненастраиваемыми свойствами нельзя вновь сделать расширяемым объектом.


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

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

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

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

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

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

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

МетодChrome
Chrome
Firefox
Firefox
Opera
Opera
Safari
Safari
Internet Explorer
IExplorer
Microsoft Edge
Edge
seal()6.04.012.05.19.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