We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

Сводка

Метод 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 2015 (6th Edition, ECMA-262)
Определение 'Object.preventExtensions' в этой спецификации.
Стандарт  

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

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

Возможность 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,