Object.seal()
Метод Object.seal()
запечатує об'єкт, запобігаючи створенню нових властивостей та відмічаючи усі існуючі властивості як недоступні для налаштування. Значення існуючих властивостей можна і надалі змінювати, якщо вони доступні для запису.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Синтаксис
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