Est-il possible de passer des paramètres dans un gestionnaire ES6 `Proxy '?

Nov 24 2020

Je veux remplacer les paramètres de base par des paramètres personnalisés et l' Proxyobjet semblait être une solution idéale.

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

mais le thiscontexte à l'intérieur du gestionnaire n'est que l' targetobjet et this.getSettings(property)échoue car il n'est pas disponible.

Il semble que ce Proxyn'est pas destiné à cela, mais je ne peux pas trouver cela déclaré sans équivoque. Peut-être devrais-je faire un cours à la place?

Réponses

edzillion Nov 25 2020 at 12:32

J'ai trouvé l'essentiel qui m'a aidé à obtenir la fonctionnalité que je voulais en enveloppant l' Proxyintérieur d'un Classet en faisant de l' settingsobjet une propriété de cette 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];
      }
    };
  }
}

Ce qui est instancié comme ceci: this.settings = new ProxySettings(this.token, baseTokenSettings);

Fonctionne bien mais c'est un peu désordonné et je n'ai jamais vu ce modèle auparavant, donc je ne suis pas certain que ce soit la meilleure façon de le faire. Toute contribution appréciée.

edzillion Nov 25 2020 at 13:52

En tenant compte des conseils utiles, la solution la plus simple qui correspondait à mes besoins était d'utiliser la syntaxe de la fonction de flèche:

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