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().
Описание
Перехваты
Эта ловушка может перехватывать следующие операции:
Или любую другую операцию, которая вызывает [[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 |
См. также
© 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