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 (ECMA-262)
The definition of 'Object.seal' in that specification.
Living Standard

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

BCD tables only load in the browser

Див. також