En ES6, las clases son azúcar sintáctico para funciones de constructor. Cuando se invoca una clase sin la nueva palabra clave, no se crea una nueva instancia de la clase. En su lugar, llama directamente a la función constructora de la clase.
Considere la siguiente clase:
class Foo {
constructor(x) {
if (!(this instanceof Foo)) return new Foo(x);
this.x = x;
}
hello() {
return `hello ${this.x}`;
}
}
Si intentamos llamar a esta clase sin la nueva palabra clave, obtenemos un error:
Cannot call a class as a function
Esto se debe a que los constructores de clases están diseñados para crear nuevas instancias de la clase. Invocarlos sin el operador new equivale a llamar a una función normal.
Para permitir llamar a un constructor de clase sin la palabra clave new, podemos usar una combinación de una función constructora y una función de flecha de la siguiente manera:
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);
Ahora, podemos llamar al constructor de clases sin la nueva palabra clave usando FooWithoutNew:
FooWithoutNew("world").hello(); // "hello world"
Sin embargo, es importante tener en cuenta que este enfoque tiene algunos inconvenientes. En primer lugar, requiere la creación de una función separada, lo que puede resultar inconveniente. En segundo lugar, interrumpe el comportamiento del constructor de devolver una nueva instancia.
En general, se recomienda llamar siempre a los constructores de clases con la nueva palabra clave para mayor claridad y coherencia.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3