Ist es möglich, Parameter an einen ES6-Proxy-Handler zu übergeben?

Nov 24 2020

Ich möchte die Grundeinstellungen mit benutzerdefinierten Einstellungen überschreiben, und das ProxyObjekt schien eine ideale Lösung zu sein.

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

Der thisKontext im Handler ist jedoch nur das targetObjekt und this.getSettings(property)schlägt fehl, weil er nicht verfügbar ist.

Scheint Proxynicht dafür gedacht zu sein, aber ich kann das nicht eindeutig finden. Vielleicht sollte ich stattdessen eine Klasse machen?

Antworten

edzillion Nov 25 2020 at 12:32

Ich habe diesen Kern gefunden, der mir geholfen hat, die gewünschte Funktionalität zu erhalten, indem ich das ProxyInnere von a verpackt Classund das settingsObjekt zu einer Eigenschaft dieser Klasse gemacht habe:

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];
      }
    };
  }
}

Welches ist so instanziiert: this.settings = new ProxySettings(this.token, baseTokenSettings);

Funktioniert gut, ist aber etwas chaotisch und ich habe dieses Muster noch nie gesehen. Daher bin ich mir nicht sicher, ob dies der beste Weg ist, dies zu tun. Jede Eingabe wird geschätzt.

edzillion Nov 25 2020 at 13:52

In Anbetracht der hilfreichen Ratschläge war die einfachste Lösung, die meinen Anforderungen entsprach, die Verwendung der Pfeilfunktionssyntax:

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