在 JS 中使用類似 PHP 的魔術方法
JavaScript 魔術方法
這個腳本使用 Proxy 實作了在 JavaScript 中使用類似 PHP 中的魔術方法。
範例
你可以這樣使用它:
const Foo = magicMethods(class Foo { constructor () { this.bar = 'Bar' } __get (name) { return `[[${name}]]` } }) const foo = new Foo foo.bar // "Bar" foo.baz // "[[baz]]"
如果你使用的是像Babel 這樣的JavaScript 編譯器,並啟用了裝飾器, 你也可以使用magicMethods 函數作為裝飾器:
@magicMethods class Foo { // ... }
支援魔術方法
給定一個類別Class 和instance,以下是此腳本支援的魔術方法:
__get(name)
當嘗試存取instance[name],而name 不是instance 中的屬性時,呼叫。
注意: 在 PHP 中,檢查 instance 中是否存在 name 不會使用任何自訂的 __isset() 方法。
__set(name, value)
當嘗試使用 instance[name] = ...,而 instance 並未設定 name 屬性時,呼叫該方法。
__isset(name)
當嘗試透過呼叫 name in instance 來檢查是否存在 name 是否存在時,呼叫該方法。
__unset(name)
當嘗試透過 delete instance[name] 來取消 name 屬性設定時,呼叫該方法。
其他方法
下面的魔術方法是透過該腳本提供支援的,但不支援在PHP:
static __getStatic(name)
類似於__get(),但是它用在Class 而不是instance.
static __setStatic(name, value)
類似於__set(),但用在Class 中而不是instance。
為什麼不支援魔術方法 X?
它們不是沒有必要就是不實用:
__construct() 不需要,JavaScript 早有 constructor。
__destruct():JavaScript 中沒有物件銷毀的鉤子機制。
__call():與 PHP 相反,方法就像 JavaScript 中的屬性一樣,首先透過 __get() 取得。要實作 __call(),你只需從 get() 回傳一個函數。
__callStatic():與 __call() 類似,但有 __getStatic()。
__sleep(),__wakeup():JavaScript 沒有內建序列化與反序列化。你可以使用 JSON.stringify() 與 JSON.parse(),但是它們沒有任何機制自動觸發的方法。
__toString() 在早有對應 JavaScript 的 toString()
__invoke():如果你試著呼叫一個非函數對象,JavaScript 將會拋出一個錯誤,這將無法避免。
__set_state():JavaScript 中沒有類似 var_export() 的東西。
__clone():JavaScript 中內建複製功能的鉤子。
__debugInfo(): 無法掛接到 console.log() 輸出。
我可以使用魔術方法擴充類別嗎?
是的,在某種程度上:
class Bar extends Foo {} // 或者,如果类 Bar 本身包含魔术方法: const Bar = magicMethods(class Bar extends Foo { // ... })
但是遺憾的是,你無法從子類別中存取父類別中的屬性:
const Foo = magicMethods(class Foo { __get() { return this.bar() } }) class Bar extends Foo { bar() { return 'value' } } // 这个 *不会* 调用 B 的 bar() 方法,而是抛出一个类型错误: (new Bar).something
推薦教學:《JS教學》
以上是在 JS 中使用類似 PHP 的魔術方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
