Object.seal()

Сводка

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

Синтаксис

Object.seal(obj)

Параметры

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

Описание

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

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

Примеры

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

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

Спецификация Статус Комментарии
ECMAScript 5.1 (ECMA-262)
Определение 'Object.seal' в этой спецификации.
Стандарт Изначальное определение. Реализована в JavaScript 1.8.5.
ECMAScript 6 (ECMA-262)
Определение 'Object.seal' в этой спецификации.
Кандидат в рекомендации  

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

Возможность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка 6 4.0 (2.0) 9 12 5.1
Возможность Android Chrome для Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базовая поддержка ? ? ? ? ? ?

На основе таблицы совместимости Kangax.

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

Метки документа и участники

 Внесли вклад в эту страницу: Mingun
 Обновлялась последний раз: Mingun,