Dans ES6, les classes sont du sucre syntaxique pour les fonctions de constructeur. Lorsqu'une classe est invoquée sans le mot-clé new, elle ne crée pas de nouvelle instance de la classe. Au lieu de cela, il appelle directement la fonction constructeur de la classe.
Considérez la classe suivante :
class Foo {
constructor(x) {
if (!(this instanceof Foo)) return new Foo(x);
this.x = x;
}
hello() {
return `hello ${this.x}`;
}
}
Si nous essayons d'appeler cette classe sans le nouveau mot-clé, nous obtenons une erreur :
Cannot call a class as a function
C'est parce que les constructeurs de classe sont conçus pour créer de nouvelles instances de la classe. Les invoquer sans l'opérateur new équivaut à appeler une fonction normale.
Pour permettre l'appel d'un constructeur de classe sans le nouveau mot-clé, nous pouvons utiliser une combinaison d'une fonction constructeur et d'une fonction flèche comme suit :
class Foo {
constructor(x) {
if (!(this instanceof Foo)) return new Foo(x);
this.x = x;
}
hello() {
return `hello ${this.x}`;
}
}
const FooWithoutNew = () => new Foo(...arguments);
Maintenant, nous pouvons appeler le constructeur de classe sans le nouveau mot-clé en utilisant FooWithoutNew:
FooWithoutNew("world").hello(); // "hello world"
Cependant, il est important de noter que cette approche présente certains inconvénients. Premièrement, cela nécessite de créer une fonction distincte, ce qui peut être gênant. Deuxièmement, cela interrompt le comportement du constructeur consistant à renvoyer une nouvelle instance.
En général, il est recommandé de toujours appeler les constructeurs de classe avec le nouveau mot-clé pour plus de clarté et de cohérence.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3