Spec-Zone.ru › JavaScript

handler.getOwnPropertyDescriptor()

Базовая поддержка Широко доступно

Эта возможность хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с сентября 2016 года.

Метод handler.getOwnPropertyDescriptor() — это ловушка для [[GetOwnProperty]] внутреннего метода объекта, который используется такими операциями, как Object.getOwnPropertyDescriptor().

Попробуйте

const monster = {
  eyeCount: 4,
};

const handler = {
  getOwnPropertyDescriptor(target, prop) {
    console.log(`called: ${prop}`);
    // Expected output: "called: eyeCount"

    return { configurable: true, enumerable: true, value: 5 };
  },
};

const proxy = new Proxy(monster, handler);

console.log(Object.getOwnPropertyDescriptor(proxy, "eyeCount").value);
// Expected output: 5

Синтаксис

new Proxy(target, {
  getOwnPropertyDescriptor(target, property) {
  }
})

Параметры

Следующие параметры передаются методу getOwnPropertyDescriptor(). this привязан к обработчику (handler).

target
Целевой объект.
property
Строка или Symbol, представляющий имя свойства.

Возвращаемое значение

Метод getOwnPropertyDescriptor() должен возвращать объект или undefined, представляющий дескриптор свойства. Отсутствующие атрибуты нормализуются так же, как и в Object.defineProperty().

Описание

Перехваты

Эта ловушка может перехватывать следующие операции:

  • Object.getOwnPropertyDescriptor()
  • Reflect.getOwnPropertyDescriptor()

Или любую другую операцию, которая вызывает [[GetOwnProperty]] внутренний метод.

Инварианты

Внутренний метод прокси [[GetOwnProperty]] выбрасывает TypeError, если определение обработчика нарушает один из следующих инвариантов:

  • Результат должен быть либо Object, либо undefined.
  • Нельзя сообщать о несуществовании свойства, если оно существует как ненастраиваемое (non-configurable) собственное свойство целевого объекта. То есть, если Reflect.getOwnPropertyDescriptor() возвращает configurable: false для свойства на target, то ловушка не должна возвращать undefined.
  • Нельзя сообщать о несуществовании свойства, если оно существует как собственное свойство нерасширяемого (non-extensible) целевого объекта. То есть, если Reflect.isExtensible() возвращает false для целевого объекта, то ловушка не должна возвращать undefined.
  • Нельзя сообщать о существовании свойства, если оно не существует как собственное свойство целевого объекта и целевой объект не является расширяемым. То есть, если Reflect.isExtensible() возвращает false для целевого объекта, а Reflect.getOwnPropertyDescriptor() возвращает undefined для свойства на target, то ловушка должна возвращать undefined.
  • Нельзя сообщать о ненастраиваемости свойства (non-configurable), если только оно не существует как ненастраиваемое собственное свойство целевого объекта. То есть, если Reflect.getOwnPropertyDescriptor() возвращает undefined или configurable: true для свойства на target, то ловушка не должна возвращать configurable: false.
  • Нельзя сообщать о том, что свойство является одновременно ненастраиваемым (non-configurable) и неперезаписываемым (non-writable), если только оно не существует как ненастраиваемое, неперезаписываемое собственное свойство целевого объекта. То есть, в дополнение к предыдущему инварианту, если Reflect.getOwnPropertyDescriptor() возвращает configurable: false, writable: true для свойства на target, то ловушка не должна возвращать configurable: false, writable: false.
  • Если свойство имеет соответствующее свойство в целевом объекте, то дескриптор свойства целевого объекта должен быть совместим с descriptor. То есть, если представить, что target является обычным объектом, то Object.defineProperty(target, property, resultObject) не должен генерировать ошибку. Ссылка Object.defineProperty() содержит больше информации, но, если подытожить, когда целевое свойство является ненастраиваемым (non-configurable), должно соблюдаться следующее:
    • configurable, enumerable, get, и set должны быть такими же, как и исходные. writable также должен быть исходным в силу предыдущего инварианта.
    • свойство должно оставаться свойством данных или свойством-аксессором
    • атрибут value может быть изменен только если writable является true

Примеры

Перехват getOwnPropertyDescriptor

Следующий код перехватывает Object.getOwnPropertyDescriptor().

const p = new Proxy(
  { a: 20 },
  {
    getOwnPropertyDescriptor(target, prop) {
      console.log(`called: ${prop}`);
      return { configurable: true, enumerable: true, value: 10 };
    },
  },
);

console.log(Object.getOwnPropertyDescriptor(p, "a").value);
// "called: a"
// 10

Следующий код нарушает инвариант.

const obj = { a: 10 };
Object.preventExtensions(obj);
const p = new Proxy(obj, {
  getOwnPropertyDescriptor(target, prop) {
    return undefined;
  },
});

Object.getOwnPropertyDescriptor(p, "a"); // TypeError is thrown

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-proxy-object-internal-methods-and-internal-slots-getownproperty-p

Совместимость с браузерами

Настольные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
getOwnPropertyDescriptor
49
12
18
36
10
49
18
36
10
5.0
49
10
1.0.0
1.0
6.0.0

См. также

  • Proxy
  • Proxy() конструктор
  • Object.getOwnPropertyDescriptor()
  • Reflect.getOwnPropertyDescriptor()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/getOwnPropertyDescriptor

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API