Object.seal()

Метод Object.seal() запечатує об'єкт, запобігаючи створенню нових властивостей та відмічаючи усі існуючі властивості як недоступні для налаштування. Значення існуючих властивостей можна і надалі змінювати, якщо вони доступні для запису.

Синтаксис

Object.seal(obj)

Параметри

obj
Об'єкт, який має бути запечатаний.

Повертає

Об'єкт, який запечатується.

Опис

За замовчуванням, об'єкти є розширюваними (до них можна додати нові властивості). Запечатування об'єкту запобігає створенню нових властивостей і робить усі існуючі властивосні недоступними для налаштування. Це робить набір властивостей об'єкта зафіксованим і незмінним. Перетворення всіх властивостей на недоступні для налаштування також запобігає зміні властивостей-значень на властивості-аксесори, та навпаки, але не запобігає зміні значеннь властивостей. Спроби додати чи видалити властивість з запечатаного об'єкта, або перетворити властивість-значення на властивість-аксесор, не спрацюють, або непомітно, або з викиданням TypeError (найчастіше, але не виключно, у строгому режимі)

Ланцюг прототипів залишається незмінним. Проте, властивість __proto__ також запечатується.

Приклади

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

// Нові властивості можуть бути додані, існуючі властивості
// можуть бути змінені або видалені.
obj.foo = 'мяв';
obj.lumpy = 'ква';
delete obj.prop;

var o = Object.seal(obj);

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

// На запечатаному об'єкті можна змінювати значення властивостей 
obj.foo = 'кря';

// Але не можна перетворити властивості-значення на властивості-аксесори,
// і навпаки.
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 = 'гав'; // викидає TypeError
}
fail();

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

Примітки

У ES5, якщо аргументом цього методу є не об'єкт (примітив), це спричинить TypeError. У ES2015 аргумент, що не є об'єктом, сприйматиметься як звичайний запечатаний об'єкт, і буде просто повернений.

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

Object.seal(1);
// 1                             (код ES2015)

Порівняння з Object.freeze()

Існуючі властивості об'єктів, заморожених методом Object.freeze(), стають незмінними. Властивості об'єкта, запечатаного методом Object.seal(), надалі можуть бути зміненні.

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

Специфікації Статус Коментар
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.seal' in that specification.
Standard Початкове визначення. Реалізоване у JavaScript 1.8.5.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.seal' in that specification.
Standard
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.seal' in that specification.
Draft

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
sealChrome Full support 6Edge Full support 12Firefox Full support 4IE Full support 9Opera Full support 12Safari Full support 5.1WebView Android Full support YesChrome Android Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Див. також