Maison  >  Questions et réponses  >  le corps du texte

Comment utiliser Proxy pour simuler l'attribut __callStatic de PHP dans Node.js

<p>J'essaie de créer le même comportement dans Node.js que la méthode magique PHP <code>__callStatic</code> </p> <p>J'essaie de le faire en utilisant <code>Proxy</code> mais je ne sais pas si c'est la meilleure option. </p> <p> <pre class="snippet-code-js lang-js Prettyprint-override"><code>class Test { constructeur() { ce.num = 0 } ensemble(num) { ceci.num = ceci.num + num rends ceci } obtenir() { renvoyer ce.num } } const TestFacade = nouveau proxy ({}, { obtenir : (_, clé) => const test = nouveau Test() retourner le test[clé] } }) //La chaîne de méthodes d'exécution se termine par get console.log(TestFacade.set(10).set(20).get()) //Résultat attendu : 30 //Résultat renvoyé : 0 // Démarre une nouvelle chaîne de méthodes d'exécution et instancie à nouveau la classe Test dans le premier ensemble console.log(TestFacade.set(20).set(20).get()) //Résultat attendu : 40 // Renvoie le résultat : 0</code></pre> </p> <p>Le problème est que chaque fois que j'essaie d'accéder aux propriétés de <code>TestFacade</code>, le piège <code>get</code> Le comportement dont j'ai besoin est que lorsque la méthode <code>set</code> est appelée, elle renvoie <code>this</code> exemple pour une utilisation ultérieure ! </p> <pre class="brush:php;toolbar:false;">const testInstance = TestFacade.set(10) // La méthode set renvoie `this` de `Test` au lieu de Proxy</pre> <p>Si quelque chose n’est pas clair, faites-le-moi savoir. </p>
P粉653045807P粉653045807381 Il y a quelques jours482

répondre à tous(1)je répondrai

  • P粉549986089

    P粉5499860892023-09-05 00:15:19

    Je ne sais pas si c’est la meilleure option. Mais je me lie à la méthode via l'instance de classe 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

    répondre
    0
  • Annulerrépondre