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 2015 (6th Edition, ECMA-262)
Определение 'Object.seal' в этой спецификации.
Стандарт

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

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung InternetNode.js
sealChrome Полная поддержка 6Edge Полная поддержка 12Firefox Полная поддержка 4IE Полная поддержка 9Opera Полная поддержка 12Safari Полная поддержка 5.1WebView Android Полная поддержка ДаChrome Android Полная поддержка 18Firefox Android Полная поддержка 4Opera Android Полная поддержка ДаSafari iOS Полная поддержка ДаSamsung Internet Android Полная поддержка Даnodejs Полная поддержка Да

Легенда

Полная поддержка  
Полная поддержка

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