Хорошо, я сделал еще несколько копаний и отследил все это до Object.getOwnPropertyDescriptor, вызываемого на моем прокси-объекте, чтобы получить значения его атрибутов.
Но атрибут "value" явно не определен вВ моем случае, поскольку у меня есть ловушка для getOwnPropertyDescriptor, которая задает только перечислимые и настраиваемые атрибуты (таким образом, делая возможным итерацию массива, использование его с операторами распространения и т. д.). Поскольку не существует стандартного способа вызова ловушки get из ловушки getOwnPropertyDescriptor, это не может быть исправлено IMHO.Хотя было бы интересно доказать, что это неправильно:)
Ну, как отметил Берги в комментариях, есть стандартный способ.
Также в документах https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/handler/getOwnPropertyDescriptor#Parameters «это связано с обработчиком»
Отредактировал мой код, чтобы отразить это.
Код, демонстрирующий поведение getOwnPropertyDescriptor, приведен ниже:
const obj = {
origAttr: 'hi'
}
const handler = {
get(target, prop) {
return 1;
},
has(target, prop) {
return true;
},
ownKeys(target) {
return [...Reflect.ownKeys(target), 'a', 'b'];
},
getOwnPropertyDescriptor(target, key) {
return {
value: this.get(target, key),
enumerable: true,
configurable: true
};
}
}
const test = new Proxy(obj, handler);
const testSpread = { ...test
};
// Defined, due to trapped getOwnPropertyDescriptor which returns a value attribute
console.log(Object.getOwnPropertyDescriptor(test, 'origAttr'))
// Defined, because it is a regular object, not a proxy with a getOwnPropertyDescriptor trap
console.log(Object.getOwnPropertyDescriptor(testSpread, 'origAttr'))