JavaScript метод Object.isFrozen()
Определение и применение
JavaScript метод isFrozen() позволяет вернуть логическое значение, которое определяет является ли объект
нерасширяемым с недоступными для настройки и изменения свойствами.
Под нерасширяемым объектом стоит понимать тот объект в котором недоступно добавление в него новых собственных свойств.
Под ненастраиваемыми свойствами стоит понимать те, атрибут configurable которых имеет значение
false, в этом случае удаление такого свойства из содержащего его объекта, а большинство последующих
изменений дескриптора запрещено. Атрибуты в свою очередь описываются дескрипторами свойств – это обычные
объекты JavaScript, которые описывают атрибуты и значение свойства. Подробную информацию о дескрипторах
свойств и атрибутах вы можете получить в описании метода
defineProperty(), который позволяет определить новое или изменить существующее свойство объекта, описывая его дескрипторами.
Кроме того, метод isFrozen() проверяет соответствует ли значение атрибута writable для
каждого собственного свойства данных значению false (изменение собственных свойств объекта с помощью
оператора присваивания не допускается). Это является его основным отличием от метода
isSealed(), который не проводит подобных проверок.
Заморозка поверхностная: вложенные объекты и внутреннее состояние, например содержимое Map, не
замораживаются. У свойств доступа нет атрибута writable; геттеры и сеттеры продолжают работать.
Неизменяемость значений проверяется только для собственных свойств данных.
Поддержка браузерами
Спецификация: ecma262
Поддерживается во всех основных браузерах с 2015 года.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
isFrozen | 6 | 12 | 4 | 12 | 5.1 | 18 | 4 | 12 | 5 | 1.0 | 4.4 | 5 |
поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31
JavaScript синтаксис
Object.isFrozen( obj );
Спецификация
Значения параметров
| Параметр | Описание |
|---|---|
obj |
Целевой объект, который проверяется. Обязательное значение. |
Исключения
| Тип исключения | Описание |
|---|---|
TypeError |
Примитивы не вызывают исключение: Object.isFrozen() и Object.isSealed() возвращают
true, а Object.isExtensible() — false. Проверка прокси может выбросить
исключение.
|
Примеры, попробуйте сами
В примере «Проверка заморозки» показан результат вызова метода.
Проверка заморозки
Измените свойства исходного объекта и сравните результат до и после вызова метода.
index.html
<html lang="ru">
<head>
<meta charset="UTF-8" />
<title>Проверка заморозки</title>
</head>
<body>
<p>Результат выполнения выводится в консоль.</p>
</body>
</html>
main.js
// инициализируем переменную, содержащую объект
let obj = {
a: 1,
b: 2,
}
// определяем является ли объект "замороженным"
console.log(Object.isFrozen(obj)) // false
// "замораживаем" объект
console.log(Object.freeze(obj))
// определяем является ли объект "замороженным"
console.log(Object.isFrozen(obj)) // true
В этом примере мы инициализировали переменную, содержащую объект и с помощью метода isFrozen() проверяем
является ли объект нерасширяемым с недоступными для настройки и изменения свойствами. После этого мы с помощью метода
freeze()
"замораживаем" объект и снова используем метод isFrozen().
В следующем примере мы рассмотрим как сделать объект нерасширяемым и с недоступными для настройки и изменения
свойствами без использования метода
freeze().
В примере «Заморозка через дескриптор» показан результат вызова метода.
Заморозка через дескриптор
Измените свойства исходного объекта и сравните результат до и после вызова метода.
index.html
<html lang="ru">
<head>
<meta charset="UTF-8" />
<title>Заморозка через дескриптор</title>
</head>
<body>
<p>Результат выполнения выводится в консоль.</p>
</body>
</html>
main.js
// инициализируем переменную, содержащую объект
let obj = {
a: 1,
}
// определяем является ли объект "замороженным"
console.log(Object.isFrozen(obj)) // false
// изменяем в объекте свойство данных
console.log(
Object.defineProperty(obj, 'a', {
configurable: false, // устанавливаем, что удаление свойства не допускается, а также не допускается изменение дескриптора этого свойства
writable: false, // изменение свойства объекта с помощью оператора присваивания не допускается
}),
)
console.log(Object.preventExtensions(obj)) // делаем объект нерасширяемым
// определяем является ли объект "замороженным"
console.log(Object.isFrozen(obj)) // true
В этом примере мы инициализируем переменную, содержащую объект, с помощью метода
defineProperty()
изменяем в этом объекте свойство данных "a" (устанавливаем, что удаление свойства не допускается, а также
не допускается изменение дескриптора этого свойства, и изменение свойства объекта с помощью оператора присваивания не
допускается.
После этого с помощью метода
preventExtensions()
делаем объект нерасширяемым (недоступно добавление в него новых собственных свойств). После этого с помощью метода
isFrozen() мы проверяем является ли наш объект нерасширяемым с недоступными для настройки и изменения
свойствами.