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)
Спецификации
Совместимость с браузерами
| 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