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