MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

Сводка

Метод Object.preventExtensions() предотвращает добавление новых свойств к объекту (то есть, предотвращает расширение этого объекта в будущем).

Синтаксис

Object.preventExtensions(obj)

Параметры

obj
Объект, который нужно сделать не расширяемым.

Описание

Объект является расширяемым, если к нему можно добавить новые свойства. Метод Object.preventExtensions() помечает объект, как более не расширяемый, так что он никогда не будет иметь других свойств, кроме тех, что были у него на момент пометки его не расширяемым. Обратите внимание, что, в общем случае, свойства не расширяемого объекта всё ещё могут быть удалены. Попытка добавить новые свойства к не расширяемому объекту потерпит неудачу, либо молча, либо с выбрасыванием исключения TypeError (как правило, но не обязательно, это происходит в строгом режиме).

Метод Object.preventExtensions() предотвращает добавление только собственных свойств. Свойства всё ещё могут быть добавлены в прототип объекта. Однако, вызов Object.preventExtensions() на объекте также предотвращает расширение его свойства __proto__ .

Если превратить расширяемый объект в не расширяемый возможно, в ECMAScript 5 нет никакого способа сделать обратную операцию.

Примеры

// Object.preventExtensions возвращает объект, который нужно сделать не расширяемым.
var obj = {};
var obj2 = Object.preventExtensions(obj);
assert(obj === obj2);

// Объекты по умолчанию являются расширяемыми.
var empty = {};
assert(Object.isExtensible(empty) === true);

// ...но это может быть изменено.
Object.preventExtensions(empty);
assert(Object.isExtensible(empty) === false);

// Object.defineProperty выбрасывает исключение при добавлении нового свойства в не расширяемый объект.
var nonExtensible = { removable: true };
Object.preventExtensions(nonExtensible);
Object.defineProperty(nonExtensible, 'new', { value: 8675309 }); // выбросит TypeError

// В строгом режиме, попытки добавить новые свойства к не расширяемому объекту, будут выбрасывать исключение TypeError.
function fail() {
  'use strict';
  nonExtensible.newProperty = 'ОШИБКА'; // выбросит TypeError
}
fail();

// РАСШИРЕНИЕ (работает только в движках, поддерживающих свойство __proto__
// (которое является устаревшим. Используйте вместо него метод Object.getPrototypeOf)):
// не расширяемые объекты неизменны.
var fixed = Object.preventExtensions({});
fixed.__proto__ = { oh: 'hai' }; // выбросит TypeError

Примечания

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

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

> Object.preventExtensions(1)
1                             // код ES6

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

Спецификация Статус Комментарии
ECMAScript 5.1 (ECMA-262)
Определение 'Object.preventExtensions' в этой спецификации.
Стандарт Изначальное определение. Реализована в JavaScript 1.8.5.
ECMAScript 6 (ECMA-262)
Определение 'Object.preventExtensions' в этой спецификации.
Кандидат в рекомендации  

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

Возможность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка 6 4.0 (2.0) 9 12 5.1
Поведение ES6 для аргументов, не являющихся объектами ? 35.0 (35.0) ? ? ?
Возможность Android Chrome для Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базовая поддержка ? ? ? ? ? ?
Поведение ES6 для аргументов, не являющихся объектами ? ? 35.0 (35.0) ? ? ?

Смотрите также

Метки документа и участники

 Внесли вклад в эту страницу: Mingun
 Обновлялась последний раз: Mingun,