Object.getOwnPropertyDescriptors() возвращает дескрипторы сразу всех собственных свойств объекта.
Если Object.getOwnPropertyDescriptor() показывает описание одного свойства, то этот метод делает то же самое сразу для всего объекта.
Синтаксис
Object.getOwnPropertyDescriptors(obj)
obj - объект, у которого нужно получить дескрипторы свойств.
Что делает Object.getOwnPropertyDescriptors()
Метод возвращает объект, где:
- ключи - это имена свойств исходного объекта
- значения - это дескрипторы этих свойств
const user = {
name: "Anna",
age: 25,
};
console.log(Object.getOwnPropertyDescriptors(user));
Результат будет примерно таким:
{
name: {
value: "Anna",
writable: true,
enumerable: true,
configurable: true
},
age: {
value: 25,
writable: true,
enumerable: true,
configurable: true
}
}
Что возвращает метод
Object.getOwnPropertyDescriptors() всегда возвращает новый объект с дескрипторами.
const result = Object.getOwnPropertyDescriptors({ a: 1 });
console.log(result.a.value); // 1
Важно понимать: метод возвращает не значения свойств, а их полные описания.
Только собственные свойства
Метод смотрит только на собственные свойства объекта.
Свойства из прототипа в результат не попадают.
const base = { role: "user" };
const person = Object.create(base);
person.name = "Anna";
console.log(Object.getOwnPropertyDescriptors(person));
// объект только с дескриптором name
Свойство role здесь не попадёт в результат, потому что оно лежит в прототипе.
В отличие от Object.keys() метод видит и неперечисляемые свойства
Это важный момент.
Object.keys() возвращает только перечисляемые свойства.
Object.getOwnPropertyDescriptors() возвращает дескрипторы всех собственных свойств, в том числе неперечисляемых.
const user = { name: "Anna" };
Object.defineProperty(user, "secret", {
value: "123",
enumerable: false,
});
console.log(Object.keys(user)); // ["name"]
console.log(Object.getOwnPropertyDescriptors(user).secret.enumerable); // false
Обычные свойства
Для обычных свойств внутри будут дескрипторы с полями:
valuewritableenumerableconfigurable
const user = { name: "Anna" };
const descriptors = Object.getOwnPropertyDescriptors(user);
console.log(descriptors.name.value); // "Anna"
console.log(descriptors.name.writable); // true
console.log(descriptors.name.enumerable); // true
console.log(descriptors.name.configurable); // true
Геттеры и сеттеры
Если свойство устроено через getter/setter, дескриптор будет другим.
const user = {
firstName: "Anna",
lastName: "Smith",
get fullName() {
return `${this.firstName} ${this.lastName}`;
},
};
const descriptors = Object.getOwnPropertyDescriptors(user);
console.log(descriptors.fullName.get); // функция getter
Для таких свойств в дескрипторе обычно будут:
getsetenumerableconfigurable
Символьные ключи тоже учитываются
Метод возвращает дескрипторы не только строковых свойств, но и свойств с ключами-символами.
const id = Symbol("id");
const user = {
name: "Anna",
[id]: 1,
};
const descriptors = Object.getOwnPropertyDescriptors(user);
console.log(descriptors[id].value); // 1
Это одно из важных отличий от методов вроде Object.keys().
Object.getOwnPropertyDescriptors() не меняет объект
Метод только читает информацию о свойствах и ничего не изменяет.
const user = { name: "Anna" };
const descriptors = Object.getOwnPropertyDescriptors(user);
console.log(user); // { name: "Anna" }
console.log(descriptors); // объект с дескрипторами
Object.getOwnPropertyDescriptors() и Object.getOwnPropertyDescriptor()
Эти методы очень близки:
Object.getOwnPropertyDescriptor()возвращает дескриптор одного свойстваObject.getOwnPropertyDescriptors()возвращает дескрипторы всех собственных свойств
const user = { name: "Anna", age: 25 };
console.log(Object.getOwnPropertyDescriptor(user, "name"));
console.log(Object.getOwnPropertyDescriptors(user));
Если нужно посмотреть одно свойство, удобнее первый метод.
Если нужен весь набор сразу, удобнее второй.
Точное клонирование объекта
Это один из самых полезных сценариев использования метода.
Через Object.assign() или spread копируются только значения перечисляемых свойств.
Через Object.getOwnPropertyDescriptors() можно сохранить ещё и дескрипторы.
const clone = Object.defineProperties(
{},
Object.getOwnPropertyDescriptors(source),
);
Такой подход сохраняет:
- неперечисляемые свойства
- getter/setter
- настройки
writable,enumerable,configurable
Почему это отличается от spread и Object.assign()
Обычная копия через spread:
const copy = { ...source };
не сохраняет полную информацию о свойствах.
Например, getter может превратиться просто в обычное значение.
Object.getOwnPropertyDescriptors() полезен именно тогда, когда нужна более точная копия структуры объекта.
Массивы тоже работают
Массив - это тоже объект, поэтому метод работает и с ним.
const arr = ["a", "b"];
const descriptors = Object.getOwnPropertyDescriptors(arr);
console.log(descriptors["0"].value); // "a"
console.log(descriptors.length.value); // 2
Это удобный способ увидеть, что у массива тоже есть обычные свойства и специальные вроде length.
Когда это полезно
Object.getOwnPropertyDescriptors() удобно использовать, когда:
- нужно получить дескрипторы сразу всех свойств объекта
- нужно разобраться, как устроен объект
- нужно точно клонировать объект вместе с getter/setter и настройками свойств
- вы работаете с
Object.defineProperties()
Частые ошибки
Думать, что метод возвращает просто значения
const user = { name: "Anna" };
console.log(Object.getOwnPropertyDescriptors(user));
Результат здесь - не { name: "Anna" }, а объект с дескрипторами.
Считать, что метод смотрит в прототип
const base = { role: "user" };
const person = Object.create(base);
console.log(Object.getOwnPropertyDescriptors(person));
Свойства из прототипа сюда не попадут.
Путать метод с Object.keys()
const user = {};
Object.defineProperty(user, "secret", {
value: "123",
enumerable: false,
});
console.log(Object.keys(user)); // []
console.log(Object.getOwnPropertyDescriptors(user).secret.value); // "123"
Object.getOwnPropertyDescriptors() видит больше информации.
Быстрая памятка
Object.getOwnPropertyDescriptors()возвращает дескрипторы всех собственных свойств объекта- метод не смотрит в прототип
- в результат попадают и неперечисляемые свойства
- геттеры и сеттеры тоже сохраняются в дескрипторах
- метод особенно полезен для точного клонирования объекта
Коротко
Object.getOwnPropertyDescriptors() - это способ получить полное описание всех собственных свойств объекта сразу. Главное, что стоит запомнить: метод особенно полезен, когда нужно не просто прочитать значения, а сохранить точную структуру объекта вместе с его дескрипторами.