¿Es posible pasar parámetros a un controlador "Proxy" de ES6?

Nov 24 2020

Quiero anular la configuración básica con configuraciones personalizadas y el Proxyobjeto parecía una solución ideal.

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

pero el thiscontexto dentro del controlador es solo el targetobjeto y this.getSettings(property)falla porque no está disponible.

Parece que Proxyno está destinado a esto, pero no puedo encontrarlo expresado de manera inequívoca. ¿Quizás debería hacer una clase en su lugar?

Respuestas

edzillion Nov 25 2020 at 12:32

Encontré esta esencia que me ayudó a obtener la funcionalidad que quería envolviendo el Proxyinterior Classy haciendo que el settingsobjeto sea una propiedad de esa clase:

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 se instancia así: this.settings = new ProxySettings(this.token, baseTokenSettings);

Funciona bien, pero es un poco complicado y no he visto este patrón antes, así que no estoy seguro de si esta es la mejor manera de hacerlo. Se agradece cualquier aporte.

edzillion Nov 25 2020 at 13:52

Al considerar los útiles consejos, la solución más simple que se ajustaba a mis necesidades era usar la sintaxis de la función de flecha:

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