ES6 : contourner le nouveau mot-clé pour l'invocation du constructeur de classe
Dans ES6, les classes servent non seulement de modèles pour les objets, mais incarnent également leurs constructeurs . La fonction constructor() sert de corps de classe et son exécution est déclenchée lorsque la classe est invoquée. Cependant, tenter d'appeler une classe sans le nouveau mot-clé requis entraîne souvent le message d'erreur « Impossible d'appeler une classe en tant que fonction ».
Comprendre l'impératif du constructeur
Les classes sont intrinsèquement liées à l'opérateur new, qui garantit qu'une nouvelle instance de la classe est créée lors de l'instanciation. Invoquer une classe sans new va à l'encontre de ce principe de conception, conduisant à l'erreur susmentionnée.
Solutions alternatives
Si le comportement souhaité est d'autoriser l'invocation de classe avec ou sans new , plusieurs alternatives existent :
1. Utiliser une fonction régulière au lieu d'une classe
Une fonction régulière peut imiter un comportement de classe sans la nouvelle exigence. Il peut toujours appliquer un comportement de type instance en utilisant cela, mais il lui manque les fonctionnalités d'encapsulation et d'héritage des classes.
<code class="js">function Foo(x) { this.x = x; this.hello = function() { return this.x; }; }</code>
2. Application du nouveau mot-clé
Si le but recherché est de toujours invoquer la classe avec new, aucune solution de contournement n'est nécessaire. Respectez simplement le modèle d'invocation du constructeur recommandé :
<code class="js">(new Foo("world")).hello(); // "hello world"</code>
3. Envelopper la classe avec une fonction régulière
Cette approche offre la flexibilité d'invoquer la classe avec ou sans new tout en conservant les avantages de l'utilisation des classes. La fonction d'emballage appelle toujours le constructeur de classe avec new.
<code class="js">class Foo { constructor(x) { this.x = x; } hello() { return `hello ${this.x}`; } } var _old = Foo; Foo = function(...args) { return new _old(...args) }; Foo("world").hello(); // "hello world" (new Foo("world")).hello(); // Also works</code>
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!