Object.preventExtensions()
Базовый уровень Широко доступен
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Статический метод Object.preventExtensions() предотвращает добавление новых свойств в объект (т.е. предотвращает будущие расширения объекта). Он также предотвращает переназначение прототипа объекта.
Попробуйте
const object = {};
Object.preventExtensions(object);
try {
Object.defineProperty(object, "foo", {
value: 42,
});
} catch (e) {
console.log(e);
// Expected output: TypeError: Cannot define property foo, object is not extensible
}
Синтаксис
Object.preventExtensions(obj)
Параметры
-
obj - Объект, который должен стать нерасширяемым.
Возвращаемое значение
Объект, который становится нерасширяемым.
Описание
Объект является расширяемым, если в него можно добавлять новые свойства. Object.preventExtensions() помечает объект как больше не являющийся расширяемым, так что в нем никогда не будет свойств, кроме тех, которые были у него на момент маркировки как нерасширяемый. Обратите внимание, что свойства нерасширяемого объекта, как правило, все еще могут быть удалены. Попытка добавить новые свойства к нерасширяемому объекту потерпит неудачу, либо молча, либо, в строгом режиме, вызовет TypeError.
В отличие от Object.seal() и Object.freeze(), Object.preventExtensions() вызывает внутреннее поведение JavaScript и не может быть заменен композицией нескольких других операций. У него также есть Reflect.preventExtensions(), который является Reflect-аналогом (который существует только для внутренних операций).
Object.preventExtensions() предотвращает только добавление собственных свойств. Свойства по-прежнему могут быть добавлены к прототипу объекта.
Этот метод делает [[Prototype]] целевого объекта неизменяемым; любое [[Prototype]] переназначение вызовет TypeError. Это поведение специфично для внутреннего свойства [[Prototype]]; другие свойства целевого объекта останутся изменяемыми.
Нет способа снова сделать объект расширяемым после того, как он был сделан нерасширяемым.
Примеры
Использование Object.preventExtensions
// Object.preventExtensions returns the object
// being made non-extensible.
const obj = {};
const obj2 = Object.preventExtensions(obj);
obj === obj2; // true
// Objects are extensible by default.
const empty = {};
Object.isExtensible(empty); // true
// They can be made un-extensible
Object.preventExtensions(empty);
Object.isExtensible(empty); // false
// Object.defineProperty throws when adding
// a new property to a non-extensible object.
const nonExtensible = { removable: true };
Object.preventExtensions(nonExtensible);
Object.defineProperty(nonExtensible, "new", {
value: 8675309,
}); // throws a TypeError
// In strict mode, attempting to add new properties
// to a non-extensible object throws a TypeError.
function fail() {
"use strict";
// throws a TypeError
nonExtensible.newProperty = "FAIL";
}
fail();
Прототип нерасширяемого объекта неизменяем:
const fixed = Object.preventExtensions({});
// throws a 'TypeError'.
fixed.__proto__ = { oh: "hai" };
Аргумент не объект
В ES5, если аргументом этого метода является не объект (примитив), это приведет к TypeError. В ES2015 аргумент, не являющийся объектом, будет возвращен как есть без ошибок, поскольку примитивы по определению уже неизменяемы.
Object.preventExtensions(1); // TypeError: 1 is not an object (ES5 code) Object.preventExtensions(1); // 1 (ES2015 code)
Спецификации
Совместимость с браузерами
| Настольные | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 | |
preventExtensions |
6 |
12 |
4 |
12 |
5.1 |
18 |
4 |
12 |
5 |
1.0 |
4.4 |
5 |
1.0.0 |
1.0 |
0.10.0 |
ES2015_behavior |
44 |
12 |
35 |
31 |
9 |
44 |
35 |
32 |
9 |
4.0 |
44 |
9 |
1.0.0 |
1.0 |
4.0.0 |
См. также
Object.isExtensible()Object.seal()Object.isSealed()Object.freeze()Object.isFrozen()Reflect.preventExtensions()
© 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/preventExtensions