Object.isExtensible() проверяет, можно ли добавлять в объект новые свойства.
Это самый прямой способ понять, остаётся ли объект расширяемым.
Синтаксис
Object.isExtensible(obj)
obj - значение, состояние которого нужно проверить.
Что делает Object.isExtensible()
Если в объект ещё можно добавлять новые свойства, метод вернёт true.
const user = { name: "Anna" };
console.log(Object.isExtensible(user)); // true
Если объект больше нельзя расширять, результат будет false.
const user = { name: "Anna" };
Object.preventExtensions(user);
console.log(Object.isExtensible(user)); // false
Что возвращает Object.isExtensible()
Object.isExtensible() всегда возвращает булево значение:
true, если объект расширяемыйfalse, если нет
const obj = {};
console.log(Object.isExtensible(obj)); // true
Что значит “объект расширяемый”
Если объект расширяемый, в него можно добавлять новые свойства.
const user = { name: "Anna" };
console.log(Object.isExtensible(user)); // true
user.age = 25;
console.log(user); // { name: "Anna", age: 25 }
Если объект нерасширяемый, новые свойства уже не добавятся.
Object.isExtensible() и Object.preventExtensions()
Эти методы напрямую связаны:
Object.preventExtensions()запрещает расширять объектObject.isExtensible()проверяет, можно ли его ещё расширять
const config = { version: 1 };
console.log(Object.isExtensible(config)); // true
Object.preventExtensions(config);
console.log(Object.isExtensible(config)); // false
Object.isExtensible() ничего не запрещает
Это важный момент.
Метод только проверяет состояние и сам ничего не меняет.
const user = { name: "Anna" };
Object.isExtensible(user);
user.age = 25;
console.log(user.age); // 25
Object.isExtensible() и Object.isSealed()
Если объект запечатан, он уже не расширяемый.
const user = { name: "Anna" };
Object.seal(user);
console.log(Object.isSealed(user)); // true
console.log(Object.isExtensible(user)); // false
Но одного isExtensible() === false ещё недостаточно, чтобы объект считался запечатанным.
Object.isExtensible() и Object.isFrozen()
Если объект заморожен, он тоже уже не расширяемый.
const user = { name: "Anna" };
Object.freeze(user);
console.log(Object.isFrozen(user)); // true
console.log(Object.isExtensible(user)); // false
Но нерасширяемый объект ещё не обязательно заморожен.
Нерасширяемый объект может оставаться изменяемым
Это один из самых важных нюансов.
const user = { name: "Anna" };
Object.preventExtensions(user);
user.name = "Ivan";
console.log(user.name); // "Ivan"
После запрета расширения существующие свойства всё ещё могут меняться.
Поэтому Object.isExtensible(obj) === false ещё не означает, что объект полностью защищён.
Массивы и Object.isExtensible()
Массив тоже является объектом, поэтому метод работает и с ним.
const numbers = [1, 2, 3];
console.log(Object.isExtensible(numbers)); // true
Object.preventExtensions(numbers);
console.log(Object.isExtensible(numbers)); // false
Это удобно, если нужно понять, можно ли ещё расширять массив.
Примитивы
Для примитивов метод возвращает false.
console.log(Object.isExtensible(123)); // false
console.log(Object.isExtensible("hello")); // false
console.log(Object.isExtensible(true)); // false
console.log(Object.isExtensible(null)); // false
console.log(Object.isExtensible(undefined)); // false
Это логично: такие значения не расширяются как обычные объекты.
Когда это полезно
Object.isExtensible() удобно использовать, когда:
- нужно проверить, можно ли ещё добавлять свойства в объект
- вы работаете с объектами после
Object.preventExtensions() - нужно понять, защищён ли объект хотя бы от расширения
Пример:
const settings = { theme: "dark" };
if (Object.isExtensible(settings)) {
settings.lang = "ru";
}
console.log(settings); // { theme: "dark", lang: "ru" }
Object.isExtensible() не меняет объект
Метод только возвращает результат проверки.
const user = { name: "Anna" };
const result = Object.isExtensible(user);
console.log(result); // true
console.log(user); // { name: "Anna" }
Частые ошибки
Думать, что Object.isExtensible() сам запрещает расширение
const user = { name: "Anna" };
Object.isExtensible(user);
user.age = 25;
console.log(user.age); // 25
Метод только проверяет состояние.
Считать, что нерасширяемый объект уже sealed или frozen
const user = { name: "Anna" };
Object.preventExtensions(user);
console.log(Object.isExtensible(user)); // false
console.log(Object.isSealed(user)); // false
Запрет расширения - это только часть более строгих состояний.
Забывать, что существующие свойства всё ещё могут меняться
const user = { name: "Anna" };
Object.preventExtensions(user);
user.name = "Ivan";
console.log(user.name); // "Ivan"
Нерасширяемость ещё не означает полную неизменяемость.
Быстрая памятка
Object.isExtensible()проверяет, можно ли добавлять в объект новые свойства- метод возвращает
trueилиfalse - сам объект метод не изменяет
- после
Object.preventExtensions()результат обычно становитсяfalse - нерасширяемый объект ещё не обязательно sealed или frozen
Коротко
Object.isExtensible() - это способ проверить, можно ли ещё расширять объект новыми свойствами. Главное, что стоит запомнить: метод ничего не меняет сам и полезен как быстрая проверка после Object.preventExtensions(), Object.seal() и Object.freeze().