Object.getOwnPropertyDescriptor(): прочитать характеристики поля
Object.getOwnPropertyDescriptor показывает дескриптор собственного свойства. Он помогает объяснить, почему поле не перечисляется или не допускает запись, хотя его значение доступно при чтении.
Назначение
Object.getOwnPropertyDescriptor показывает дескриптор собственного свойства. Он помогает объяснить, почему поле не перечисляется или не допускает запись, хотя его значение доступно при чтении.
Как это работает
Для отсутствующего собственного ключа возвращается undefined, даже если такое имя находится в прототипе. Полученный дескриптор — отдельный объект; изменение его полей само по себе не меняет характеристики исходного свойства.
Пример
const base = {kind:"guide"};
const lesson = Object.create(base);
Object.defineProperty(lesson, "title", {value:"DOM", writable:true});
const descriptor = Object.getOwnPropertyDescriptor(lesson, "title");
console.assert(descriptor.value === "DOM");
console.assert(descriptor.enumerable === false);
console.assert(Object.getOwnPropertyDescriptor(lesson, "kind") === undefined);
descriptor.value = "CSS";
console.assert(lesson.title === "DOM");
console.log(descriptor);
Что должно получиться
Дескриптор объясняет неперечислимость title, а унаследованный kind не выдаётся как собственное поле. Изменение копии дескриптора не переименовывает урок.
Граница применения и частая ошибка
Для свойств доступа дескриптор содержит get и set вместо value и writable. Не вызывайте найденные функции доступа автоматически при диагностике чужих объектов: у них могут быть побочные эффекты. Для реального изменения используйте defineProperty с учётом действующих ограничений.
Самостоятельная проверка
Сравните дескриптор свойства, созданного обычным присваиванием, с примером. Затем создайте безопасный учебный getter и изучите поля его дескриптора. Объясните отсутствие value в таком результате.
Пример JavaScript проверяйте в собственном учебном файле или консоли своего проекта. Встроенная песочница справочника JavaScript не выполняет. Успешное выполнение в одной среде не гарантирует поддержку метода во всех браузерах.