В ES6 классы являются синтаксическим сахаром для функций конструктора. Когда класс вызывается без ключевого слова new, он не создает новый экземпляр класса. Вместо этого он напрямую вызывает функцию-конструктор класса.
Рассмотрим следующий класс:
class Foo {
constructor(x) {
if (!(this instanceof Foo)) return new Foo(x);
this.x = x;
}
hello() {
return `hello ${this.x}`;
}
}
Если мы попытаемся вызвать этот класс без ключевого слова new, мы получим ошибку:
Cannot call a class as a function
Это связано с тем, что конструкторы классов разработаны для создания новых экземпляров класса. Их вызов без оператора new эквивалентен вызову обычной функции.
Чтобы разрешить вызов конструктора класса без ключевого слова new, мы можем использовать комбинацию функции-конструктора и функции стрелки следующим образом:
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);
Теперь мы можем вызвать конструктор класса без ключевого слова new, используя FooWithoutNew:
FooWithoutNew("world").hello(); // "hello world"
Однако важно отметить, что этот подход имеет некоторые недостатки. Во-первых, это требует создания отдельной функции, что может быть неудобно. Во-вторых, это нарушает поведение конструктора при возврате нового экземпляра.
В общем, для ясности и последовательности рекомендуется всегда вызывать конструкторы классов с ключевым словом new.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3