在 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