Сводка
Метод 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) | ? | ? | ? |