首頁 > web前端 > js教程 > 如何使用 ES6 類別擴展函數並存取實例變數?

如何使用 ES6 類別擴展函數並存取實例變數?

Linda Hamilton
發布: 2024-10-21 06:04:02
原創
632 人瀏覽過

How to Extend Functions with ES6 Classes and Access Instance Variables?

使用 ES6 類別擴充函數

ES6 引進了擴充特殊物件(如 Function 物件)的功能。這允許我們創建從函數繼承並在呼叫時表現得像函數的類別。然而,實作此類呼叫的邏輯需要仔細考慮。

理解函數原型

當將類別作為函數呼叫時,this 關鍵字指的是全域物件(瀏覽器環境中的視窗)而不是類別實例。要存取類別實例,我們不能使用傳統的 super() 調用,因為它需要 Function 建構函數的程式碼字串。

對值進行硬編碼

一種方法是將值硬編碼到構造函數中:

class Smth extends Function {
  constructor(x) {
    super("return " + JSON.stringify(x) + ";");
  }
}

(new Smth(256))() // Returns 256
登入後複製

但是,這並不理想,因為它依賴於硬編碼值。

利用閉包

要啟用可以存取實例變數的閉包,我們可以在建構函式中建立一個巢狀函數:

class Smth extends Function {
  constructor(x) {
    // Refer to `smth` instead of `this`
    function smth() {
      return x;
    }
    Object.setPrototypeOf(smth, Smth.prototype);
    return smth;
  }
}

(new Smth(256))() // Returns 256
登入後複製

使用ExtensibleFunction 進行抽象

要抽象化此模式,我們可以建立一個ExtensibleFunction 類別:

class ExtensibleFunction extends Function {
  constructor(f) {
    return Object.setPrototypeOf(f, new.target.prototype);
  }
}

class Smth extends ExtensibleFunction {
  constructor(x) {
    super(function() {
      return x;
    });
  }
}

(new Smth(256))() // Returns 256
登入後複製

這種方法提供了一種可重複使用的方法來建立可存取實例變數的可擴充函數。

以上是如何使用 ES6 類別擴展函數並存取實例變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板