So simulieren Sie mit Proxy das __callStatic-Attribut von PHP in Node.js
P粉653045807
P粉653045807 2023-09-04 09:05:21
0
1
481
<p>Ich versuche, in Node.js das gleiche Verhalten wie die PHP-Magie-Methode <code>__callStatic</code> zu erzeugen. </p> <p>Ich versuche es mit <code>Proxy</code>, bin mir aber nicht sicher, ob das die beste Option ist. </p> <p> <pre class="snippet-code-js lang-js Prettyprint-override"><code>class Test { Konstrukteur() { this.num = 0 } set(num) { this.num = this.num + num gib das zurück } erhalten() { gib diese.num zurück } } const TestFacade = new Proxy({}, { get: (_, Schlüssel) => const test = neuer Test() Rückgabetest[Schlüssel] } }) //Die Ausführungsmethodenkette endet mit get console.log(TestFacade.set(10).set(20).get()) //Erwartetes Ergebnis: 30 //Ergebnis zurückgeben: 0 // Eine neue Ausführungsmethodenkette starten und die Testklasse im ersten Satz erneut instanziieren console.log(TestFacade.set(20).set(20).get()) //Erwartetes Ergebnis: 40 // Ergebnis zurückgeben: 0</code></pre> </p> <p>Das Problem ist, dass jedes Mal, wenn ich versuche, auf die Eigenschaften von <code>TestFacade</code> zuzugreifen, die <code>get</code>-Falle ausgelöst wird. Das Verhalten, das ich benötige, ist, dass die Methode <code>set</code> <code>dies</code> der Klasse <code>Test</code> zurückgibt Instanz zur späteren Verwendung! </p> <pre class="brush:php;toolbar:false;">const testInstance = TestFacade.set(10) // Die Set-Methode gibt „this“ von „Test“ anstelle von Proxy zurück</pre> <p>Wenn etwas unklar ist, lassen Sie es mich bitte wissen. </p>
P粉653045807
P粉653045807

Antworte allen(1)
P粉549986089

我不知道这是否是最佳选择。但是我通过在get陷阱中返回一个新的代理来解决了这个问题,该代理使用apply陷阱将test类实例绑定到方法中:

class Facade {
  static #facadeAccessor

  static createFacadeFor(provider) {
    this.#facadeAccessor = provider

    return new Proxy(this, { get: this.__callStatic.bind(this) })
  }

  static __callStatic(facade, key) {
    /**
     * 访问Facade类的方法而不是提供者的方法。
     */
    if (facade[key]) {
      return facade[key]
    }

    const provider = new this.#facadeAccessor()

    const apply = (method, _this, args) => method.bind(provider)(...args)

    if (provider[key] === undefined) {
      return undefined
    }

    /**
     * 访问类的属性。
     */
    if (typeof provider[key] !== 'function') {
      return provider[key]
    }

    return new Proxy(provider[key], { apply })
  }
}

class Test {
  num = 0

  set(num) {
    this.num = this.num + num

    return this
  }

  get() {
    return this.num
  }
}

const TestFacade = Facade.createFacadeFor(Test)

console.log(TestFacade.set(10).set(20).get()) // 30
console.log(TestFacade.set(5).set(5).get()) // 10

const testInstance = TestFacade.set(10)

console.log(testInstance.num) // 10
console.log(testInstance.get()) // 10
console.log(testInstance.set(10).get()) // 20
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!