No ES6, as classes são açúcar sintático para funções de construtor. Quando uma classe é invocada sem a palavra-chave new, ela não cria uma nova instância da classe. Em vez disso, ele chama a função construtora da classe diretamente.
Considere a seguinte classe:
class Foo {
constructor(x) {
if (!(this instanceof Foo)) return new Foo(x);
this.x = x;
}
hello() {
return `hello ${this.x}`;
}
}
Se tentarmos chamar esta classe sem a palavra-chave new, obteremos um erro:
Cannot call a class as a function
Isso ocorre porque os construtores de classe são projetados para criar novas instâncias da classe. Invocá-los sem o operador new é equivalente a chamar uma função regular.
Para permitir chamar um construtor de classe sem a palavra-chave new, podemos usar uma combinação de uma função construtora e uma função de seta como segue:
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);
Agora, podemos chamar o construtor da classe sem a palavra-chave new usando FooWithoutNew:
FooWithoutNew("world").hello(); // "hello world"
No entanto, é importante observar que essa abordagem tem algumas desvantagens. Primeiro, é necessária a criação de uma função separada, o que pode ser inconveniente. Em segundo lugar, ele quebra o comportamento do construtor de retornar uma nova instância.
Em geral, é recomendado sempre chamar os construtores de classe com a palavra-chave new para maior clareza e consistência.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3