Spec-Zone.ru › JavaScript

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)

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

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

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

Настольные Мобильные Сервер
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

Spec-Zone.ru

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