Ссылаясь на прокси это внутри класса getter
У меня есть следующий придуманный код:
class Animal {
get age() {
return this.baseage + 10;
}
age2() {
return this.baseage + 10;
}
}
const handler = {
"get": function(target, key) {
if (key === "baseage") {
return 20;
}
return target[key];
}
};
const animal = new Proxy(new Animal(), handler);
console.log(animal.age);
console.log(animal.age2());
Который производит
NaN
30
На узле 6.11.0.
Я ожидаю, что код в классе getter, в частности, this.baseage
, чтобы пройти через обработчик прокси, но это не так. Есть ли причина для этого?
1 ответ
return target[key];
не такое поведение, как по умолчанию get
обработчик. Это причина сломанного get age
функция.
const handler = {
"get": function(target, key) {
if (key === "baseage") {
return 20;
}
return target[key];
}
};
должно быть
const handler = {
"get": function(target, key, receiver) {
if (key === "baseage") {
return 20;
}
return Reflect.get(target, key, receiver);
}
};
Когда вы делаете target[key]
ты звонишь get age(){
, но вы звоните с target
как this
, какой new Animal
объект, а не прокси. Поскольку объект Proxy является тем, который обрабатывает baseage
, не Animal
ты вернешься undefined
,
В этом примере receiver
фактический объект прокси, так что вы могли бы сделать receiver[key]
чтобы ваш фрагмент работал, но есть множество других крайних случаев, которые вы бы не рассмотрели в общем виде.
Каждый Proxy
Функция-обработчик имеет Reflect.XX
версия, которая предоставляет поведение по умолчанию. Всякий раз, когда вы пишете прокси и просто хотите, чтобы он действовал так, как обычно, вы должны использовать Reflect
,