Object.seal()

Метод Object.seal() запечатывает объект, предотвращая добавление новых свойств к объекту и делая все существующие свойства не настраиваемыми. Значения представленных свойств всё ещё могут изменяться, поскольку они остаются записываемыми.

Синтаксис

Object.seal(obj)

Параметры

obj

Запечатываемый объект.

Описание

По умолчанию, объекты являются расширяемыми (к ним могут добавляться новые свойства). Запечатывание объекта предотвращает добавление к нему новых свойств и делает все существующие свойства не настраиваемыми. Оно делает все свойства объекта фиксированными и неизменными. Пометка всех свойств объекта как не настраиваемых также предотвращает их преобразование из свойств данных в свойства доступа и наоборот, но не предотвращает изменение значения свойств данных. Попытки удаления или добавления свойств к запечатанному объекту, либо преобразования свойств данных в свойства доступа и наоборот, будут терпеть неудачу, либо молча, либо с выбрасыванием исключения TypeError (как правило, но не обязательно, это происходит в строгом режиме).

Цепочка прототипов не затрагивается. Однако, свойство __proto__ Deprecated также запечатываться.

Примеры

var obj = {
  prop: function() {},
  foo: 'bar'
};

// Новые свойства могу быть добавлены, существующие свойства могут быть изменены или удалены.
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;

var o = Object.seal(obj);

assert(o === obj);
assert(Object.isSealed(obj) === true);

// Изменение значений свойств на запечатанном объекте всё ещё работает.
obj.foo = 'quux';

// Но вы не можете преобразовать свойства данных в свойства доступа и наоборот.
Object.defineProperty(obj, 'foo', { get: function() { return 'g'; } }); // выбросит TypeError

// Теперь любые изменения, кроме изменения значений свойств, не будут работать.
obj.quaxxor = 'дружелюбная утка'; // молча не добавит свойство
delete obj.foo; // молча не удалит свойство

// ...а в строгом режиме такие попытки будут выбрасывать исключения TypeError.
function fail() {
  'use strict';
  delete obj.foo; // выбросит TypeError
  obj.sparky = 'arf'; // выбросит TypeError
}
fail();

// Попытка добавить что-то через Object.defineProperty также выбросит исключение.
Object.defineProperty(obj, 'ohai', { value: 17 }); // выбросит TypeError
Object.defineProperty(obj, 'foo', { value: 'eit' }); // изменяем значение существующего свойства

Примечания

В ES5, если аргумент метода не является объектом (является примитивным значением), будет выброшено исключение TypeError. В ES6 такой аргумент будет рассматриваться, как простой запечатанный объект и метод его просто вернёт.

> Object.seal(1)
TypeError: 1 is not an object // код ES5

> Object.seal(1)
1                             // код ES6

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

Specification
ECMAScript Language Specification
# sec-object.seal

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также