Spec-Zone.ru › JavaScript

Object.seal()

Базовая поддержка Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в разных версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

Статический метод Object.seal() запечатывает объект. Запечатывание объекта предотвращает добавление новых свойств и делает существующие свойства неконфигурируемыми. Запечатанный объект имеет фиксированный набор свойств: новые свойства нельзя добавить, существующие свойства нельзя удалить, их перечисляемость и конфигурируемость нельзя изменить, а его прототип нельзя переназначить. Значения существующих свойств по-прежнему можно изменять, если они доступны для записи. seal() возвращает тот же объект, который был передан.

Попробуйте

const object = {
  foo: 42,
};

Object.seal(object);
object.foo = 33;
console.log(object.foo);
// Expected output: 33

delete object.foo; // Cannot delete when sealed
console.log(object.foo);
// Expected output: 33

Синтаксис

Object.seal(obj)

Параметры

obj
Объект, который должен быть запечатан.

Возвращаемое значение

Запечатываемый объект.

Описание

Запечатывание объекта эквивалентно предотвращению добавления новых свойств, а затем изменению всех существующих дескрипторов свойств на configurable: false. Это приводит к тому, что набор свойств объекта становится фиксированным. Сделать все свойства неконфигурируемыми также означает, что их нельзя преобразовать из свойств данных в свойства-аксессоры и наоборот, но это не мешает изменять значения свойств данных. Попытки удалить или добавить свойства к запечатанному объекту, или преобразовать свойство данных в свойство-аксессор или наоборот, завершатся ошибкой, либо молча, либо путем вызова TypeError (чаще всего, но не исключительно, в коде строгого режима).

Приватные элементы не являются свойствами и не имеют концепции дескрипторов свойств. Приватные элементы нельзя добавлять или удалять из объекта, независимо от того, запечатан объект или нет.

Цепочка прототипов остается без изменений. Однако из-за эффекта предотвращения добавления новых свойств [[Prototype]] нельзя переназначить.

В отличие от Object.freeze(), в объектах, запечатанных с помощью Object.seal(), можно изменять существующие свойства, если они доступны для записи.

Примеры

Использование Object.seal

const obj = {
  prop() {},
  foo: "bar",
};

// New properties may be added, existing properties
// may be changed or removed.
obj.foo = "baz";
obj.lumpy = "woof";
delete obj.prop;

const o = Object.seal(obj);

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

// Changing property values on a sealed object
// still works.
obj.foo = "quux";

// But you can't convert data properties to accessors,
// or vice versa.
Object.defineProperty(obj, "foo", {
  get() {
    return "g";
  },
}); // throws a TypeError

// Now any changes, other than to property values,
// will fail.
obj.quaxxor = "the friendly duck";
// silently doesn't add the property
delete obj.foo;
// silently doesn't delete the property

// … and in strict mode such attempts
// will throw TypeErrors.
function fail() {
  "use strict";
  delete obj.foo; // throws a TypeError
  obj.sparky = "arf"; // throws a TypeError
}
fail();

// Attempted additions through
// Object.defineProperty will also throw.
Object.defineProperty(obj, "ohai", {
  value: 17,
}); // throws a TypeError
Object.defineProperty(obj, "foo", {
  value: "eit",
}); // changes existing property value

Аргумент не являющийся объектом

В ES5, если аргумент для этого метода не является объектом (примитив), то будет вызвано TypeError. В ES2015 не-объектный аргумент будет возвращен как есть без ошибок, поскольку примитивы по определению уже неизменны.

Object.seal(1);
// TypeError: 1 is not an object (ES5 code)

Object.seal(1);
// 1                             (ES2015 code)

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

Спецификация
ECMAScript® 2027 Language Specification
# sec-object.seal

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

Desktop Mobile Server
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
seal
6
12
4
12
5.1
18
4
12
5
1.0
4.4
5
1.0.0
1.0
0.10.0

См. также

  • Object.isSealed()
  • Object.preventExtensions()
  • Object.isExtensible()
  • Object.freeze()
  • Object.isFrozen()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API