Maison  >  Article  >  interface Web  >  Comment appeler des classes ES6 sans le mot clé « nouveau » ?

Comment appeler des classes ES6 sans le mot clé « nouveau » ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 03:18:02463parcourir

 How to Invoke ES6 Classes Without the `new` Keyword?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn