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.
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