É possível passar parâmetros para um manipulador ES6 `Proxy '?

Nov 24 2020

Quero substituir as configurações básicas por configurações personalizadas e o Proxyobjeto parecia uma solução ideal.

  settingsHandler = {
    get(target, property) {
        return this.getSettings(property) || target[property];
    }
  }
  this.settings = new Proxy(baseSettings, settingsHandler);

mas o thiscontexto dentro do manipulador é apenas o targetobjeto e this.getSettings(property)falha porque não está disponível.

Parece que Proxynão foi feito para isso, mas não consigo encontrar isso afirmado de forma inequívoca. Talvez eu deva fazer uma aula em vez disso?

Respostas

edzillion Nov 25 2020 at 12:32

Eu encontrei esta essência que me ajudou a obter a funcionalidade que eu queria, envolvendo o Proxyinterior de a Classe tendo o settingsobjeto como uma propriedade dessa classe:

export default class ProxySettings extends Object {
  token: Token;
  settings: TokenSettings;

  constructor(token, settings) {
    super(...arguments);
    this.token = token;
    this.settings = settings;
    return new Proxy(this, this.handler);
  }
  get handler() {
    return {
      get(target, property) {
        return target.token.getSettings(property) || target.settings[property];
      }
    };
  }
}

Que é instanciado assim: this.settings = new ProxySettings(this.token, baseTokenSettings);

Funciona bem, mas é um pouco confuso e não vi esse padrão antes, então não tenho certeza se essa é a melhor maneira de fazer isso. Qualquer entrada apreciada.

edzillion Nov 25 2020 at 13:52

Ao considerar o conselho útil, a solução mais simples que atendeu às minhas necessidades foi usar a sintaxe da função de seta:

const settingsHandler = {
  get: (target, property) => {
      return this.getSettings(property) || target[property];
  }
}