使用ES6 類別擴充函數:理解「this」和閉包技巧
擴充ES6 中的特殊物件允許從函數繼承,從而允許從函數繼承,從而允許從函數繼承使它們成為可能被稱為函數。但是,實作此類呼叫的邏輯需要仔細考慮“this”引用。
預設情況下,當在類別實例上呼叫方法時,「this」指向實例本身。然而,當直接呼叫函數時,「this」指的是全域物件(例如,視窗)。為了解決這個問題,我們有兩個選擇:
1。在建構函數中硬編碼資料:
「super」呼叫可以呼叫 Function 建構函數,需要一個代碼字串。要存取實例數據,我們可以對其進行硬編碼:
class Smth extends Function { constructor(x) { super("return " + JSON.stringify(x) + ";"); } }
2.閉包和閉包包裝器:
為了更靈活的解決方案,我們需要建立一個閉包,將實例資料指派給傳回的函數:
class Smth extends Function { constructor(x) { function smth() { return x; } Object.setPrototypeOf(smth, Smth.prototype); return smth; } }
為了抽象化此功能,我們可以引入一個'ExtensibleFunction' 類別:
class ExtensibleFunction extends Function { constructor(f) { return Object.setPrototypeOf(f, new.target.prototype); } }
子類別可以繼承ExtensibleFunction:
class Smth extends ExtensibleFunction { constructor(x) { super(function() { return x; }); } }
使用箭頭函數或命名函數也可以提供替代方法,儘管它們可能在以下方面有所不同:他們的繼承行為。
以上是如何擴展 ES6 類別中的函數:導航「this」和閉包技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!