क्या ES6 `प्रॉक्सी 'हैंडलर में मापदंडों को पारित करना संभव है?

Nov 24 2020

मैं कस्टम सेटिंग्स के साथ बेस सेटिंग्स को ओवरराइड करना चाहता हूं और Proxyऑब्जेक्ट एक आदर्श समाधान की तरह लग रहा था।

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

लेकिन thisहैंडलर के अंदर का संदर्भ सिर्फ targetवस्तु है, और this.getSettings(property)विफल है क्योंकि यह उपलब्ध नहीं है।

ऐसा लगता Proxyहै कि इस के लिए नहीं है, लेकिन मुझे लगता है कि असमान रूप से कहा नहीं मिल सकता है। शायद मुझे इसके बजाय एक वर्ग बनाना चाहिए?

जवाब

edzillion Nov 25 2020 at 12:32

मुझे यह पता चला जिसने मुझे Proxyअंदर से लपेटकर Classऔर settingsउस वर्ग की एक संपत्ति होने के कारण मुझे जो कार्यक्षमता प्राप्त करने में मदद मिली , वह है:

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

जो तत्काल की तरह है: this.settings = new ProxySettings(this.token, baseTokenSettings);

अच्छी तरह से काम करता है, लेकिन यह थोड़ा गड़बड़ है और मैंने इस पैटर्न को पहले नहीं देखा है इसलिए मैं कुछ अनिश्चित हूं अगर यह ऐसा करने का सबसे अच्छा तरीका है। किसी भी इनपुट की सराहना की।

edzillion Nov 25 2020 at 13:52

सहायक सलाह पर विचार करने पर, मेरी जरूरतों के हिसाब से फिट होने वाला सबसे सरल समाधान तीर फ़ंक्शन सिंटैक्स का उपयोग करना था:

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