首頁 >web前端 >js教程 >JavaScript 中可以不使用「new」關鍵字來呼叫類別建構子嗎?

JavaScript 中可以不使用「new」關鍵字來呼叫類別建構子嗎?

Barbara Streisand
Barbara Streisand原創
2024-10-26 04:12:27193瀏覽

 Can You Call a Class Constructor Without the 'new' Keyword in JavaScript?

呼叫不含「new」關鍵字的類別建構子

在 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”關鍵字來啟動建構函式並建立新物件。

省略「new」關鍵字:解與權衡

主要有三種方法要克服此限制:

1.常規函數

除了使用類別之外,我們還可以定義一個行為類似的常規函數。

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn