ES6 permet l'extension d'objets spéciaux, y compris l'objet Function. Cela signifie qu'il est possible d'hériter de l'objet Function et de créer des objets pouvant être appelés en tant que fonctions. Cependant, la mise en œuvre de la logique de ces appels peut être difficile, car le comportement de celui-ci lors de l'appel d'une fonction en tant que fonction est différent de celui lors de son appel en tant que méthode.
Utiliser une fermeture pour accéder aux données d'instance.
L'approche traditionnelle de ce problème consiste à utiliser une fermeture. Une fermeture est une fonction qui a accès à l'environnement dans lequel elle a été créée. Cela permet à la fonction d'accéder aux données d'instance de la classe même lorsqu'elle est appelée en tant que fonction.
<code class="js">class Smth extends Function { constructor(x) { super(() => { return x; }); } }</code>
Utiliser une fonction d'extension
Une autre approche consiste à utiliser une fonction d'extension. Une fonction d'extension est une fonction qui peut être utilisée pour étendre le comportement d'objets existants. Dans ce cas, nous pouvons utiliser une fonction d'extension pour créer une version étendue de l'objet Function qui nous permettra d'accéder aux données d'instance lorsque l'objet est appelé en tant que fonction.
<code class="js">class ExtensibleFunction extends Function { constructor(f) { return Object.setPrototypeOf(f, new.target.prototype); } } class Smth extends ExtensibleFunction { constructor(x) { super(() => { return x; }); } }</code>
Cette approche est plus flexible plutôt que d'utiliser une fermeture, car elle peut être utilisée pour étendre n'importe quelle fonction, pas seulement l'objet Function.
En utilisant ces techniques, il est possible d'étendre l'objet Function avec des classes ES6 et d'implémenter une logique personnalisée pour les appels de fonction. .
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!