在 ES6 中,類別為封裝和繼承提供了簡潔的語法。但是,呼叫不含“new”關鍵字的類別建構子可能會成為絆腳石。
考慮以下類別:
<code class="javascript">class Foo { constructor(x) { if (!(this instanceof Foo)) return new Foo(x); this.x = x; } hello() { return `hello ${this.x}`; } }</code>
直覺上,人們可能期望以下程式碼能夠運作:
<code class="javascript">Foo("world").hello(); // "hello world"</code>
但是,此嘗試失敗,並出現錯誤「無法將類別作為函數呼叫。當呼叫該類別時,將呼叫該建構函數,並建立該類別的實例。因此,必須使用“new”關鍵字來啟動建構函式並建立新物件。
主要有三種方法要克服此限制:
除了使用類別之外,我們還可以定義一個行為類似的常規函數。
2.強制使用“new”關鍵字為了確保始終使用“new”關鍵字調用該類,可以在構造函數中實現一項檢查:<code class="javascript">function Foo(x) { if (!(this instanceof Foo)) return new Foo(x); this.x = x; this.hello = function() { return this.x; } }</code>3.包裝函數透過將類別包裝在常規函數中,可以使用或不使用「new」關鍵字來呼叫它。
<code class="javascript">class Foo { constructor(x) { if (!(this instanceof Foo)) throw new Error("Class must be invoked with 'new'"); this.x = x; } hello() { return `hello ${this.x}`; } }</code>每個解都有自己的權衡。常規函數缺乏類別的封裝和繼承優勢,而強制的“new”關鍵字可能會限制某些場景下的靈活性。包裝函數方法在兩個選項之間取得了平衡。
以上是JavaScript 中可以不使用「new」關鍵字來呼叫類別建構子嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!