--- title: Object.seal() slug: Web/JavaScript/Reference/Global_Objects/Object/seal tags: - ECMAScript5 - JavaScript - Об'єкт - метод translation_of: Web/JavaScript/Reference/Global_Objects/Object/seal ---
{{JSRef}}

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

{{EmbedInteractiveExample("pages/js/object-prototype-seal.html")}}

Синтаксис

Object.seal(obj)

Параметри

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

Повертає

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

Опис

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

Ланцюг прототипів залишається незмінним. Проте, властивість {{jsxref("Object.proto", "__proto__")}} {{deprecated_inline}} також запечатується.

Приклади

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, якщо аргументом цього методу є не об'єкт (примітив), це спричинить {{jsxref("TypeError")}}. У ES2015 аргумент, що не є об'єктом, сприйматиметься як звичайний запечатаний об'єкт, і буде просто повернений.

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

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

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

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

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

Специфікації Статус Коментар
{{SpecName('ES5.1', '#sec-15.2.3.8', 'Object.seal')}} {{Spec2('ES5.1')}} Початкове визначення. Реалізоване у JavaScript 1.8.5.
{{SpecName('ES6', '#sec-object.seal', 'Object.seal')}} {{Spec2('ES6')}}
{{SpecName('ESDraft', '#sec-object.seal', 'Object.seal')}} {{Spec2('ESDraft')}}

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

{{Compat("javascript.builtins.Object.seal")}}

Див. також