Comment utiliser Proxy pour simuler l'attribut __callStatic de PHP dans Node.js
Michael Jordan
Michael Jordan 2023-09-04 09:05:21
0
1
469

J'essaie de créer le même comportement dans Node.js que la méthode magique PHP __callStatic

J'essaie de le faire en utilisant Proxy mais je ne sais pas si c'est la meilleure option.

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

Le problème est que chaque fois que j'essaie d'accéder aux propriétés de TestFacade, le piège get Le comportement dont j'ai besoin est que lorsque la méthode set est appelée, elle renvoie this exemple pour une utilisation ultérieure !

const testInstance = TestFacade.set(10) // La méthode set renvoie `this` de `Test` au lieu de Proxy

Si quelque chose n’est pas clair, faites-le-moi savoir.

Michael Jordan
Michael Jordan

répondre à tous (1)
P粉549986089

Je ne sais pas si c’est la meilleure option. Mais je me lie à la méthode via l'instance de classeget陷阱中返回一个新的代理来解决了这个问题,该代理使用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
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!