在 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);
现在,我们可以使用 FooWithoutNew:
FooWithoutNew("world").hello(); // "hello world"
但是,需要注意的是,这种方法有一些缺点。首先,它需要创建一个单独的函数,这可能很不方便。其次,它破坏了构造函数返回新实例的行为。
一般情况下,为了清晰和一致性,建议始终使用 new 关键字调用类构造函数。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3