Ссылаясь на прокси это внутри класса 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,

Другие вопросы по тегам