Learn JavaScript

Object.isExtensible() - метод для проверки расширяемости объекта в JavaScript

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().