JavaScript 魔術(shù)方法
創(chuàng)新互聯(lián)是專業(yè)的肇慶網(wǎng)站建設(shè)公司,肇慶接單;提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行肇慶網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
這個(gè)腳本使用 Proxy 實(shí)現(xiàn)了在 JavaScript 中使用類似于 PHP 中的魔術(shù)方法。
示例
你可以這樣使用它:
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 函數(shù)作為裝飾器:
@magicMethods class Foo { // ... }
支持魔術(shù)方法
給定一個(gè)類 Class 和 instance,以下是此腳本支持的魔術(shù)方法:
__get(name)
當(dāng)嘗試訪問 instance[name],而 name 不是 instance 中的屬性時(shí),調(diào)用。
注意: 在 PHP 中,檢查 instance 中是否存在 name 不會(huì)使用任何自定義的 __isset() 方法。
__set(name, value)
當(dāng)嘗試使用 instance[name] = ...,而 instance 并未設(shè)置 name 屬性時(shí),調(diào)用該方法。
__isset(name)
當(dāng)嘗試通過調(diào)用 name in instance 來檢查是否存在 name 是否存在時(shí),調(diào)用該方法。
__unset(name)
當(dāng)嘗試通過 delete instance[name] 來取消 name 屬性設(shè)置時(shí),調(diào)用該方法。
其他方法
下面的魔術(shù)方法是通過該腳本提供支持的,但不支持在 PHP:
static __getStatic(name)
類似于 __get(),但是它用在 Class 而不是 instance.
static __setStatic(name, value)
類似于 __set(),但是用在 Class 中而不是 instance。
為什么不支持魔術(shù)方法 X?
它們不是沒有必要就是不實(shí)用:
__construct() 不需要,JavaScript 早有 constructor。
__destruct():JavaScript 中沒有對(duì)象銷毀的鉤子機(jī)制。
__call():與 PHP 相反,方法就像 JavaScript 中的屬性一樣,首先通過 __get() 獲取。要實(shí)現(xiàn) __call(),你只需從 get() 返回一個(gè)函數(shù)。
__callStatic():與 __call() 類似,但是具有 __getStatic()。
__sleep(),__wakeup():JavaScript 沒有內(nèi)置序列化與反序列化。你可以使用 JSON.stringify() 與 JSON.parse(),但是它們沒有機(jī)制自動(dòng)觸發(fā)的任何方法。
__toString() 在早有對(duì)應(yīng) JavaScript 的 toString()
__invoke():如果你試圖調(diào)用一個(gè)非函數(shù)對(duì)象,JavaScript 將會(huì)拋出一個(gè)錯(cuò)誤,這將無法避免。
__set_state():JavaScript 中沒有類似于 var_export() 的東西。
__clone():JavaScript 中內(nèi)置克隆功能的鉤子。
__debugInfo(): 無法掛接到 console.log() 輸出。
我可以使用魔術(shù)方法擴(kuò)展類嗎?
是的,在一定程度上:
class Bar extends Foo {} // 或者,如果類 Bar 本身包含魔術(shù)方法: const Bar = magicMethods(class Bar extends Foo { // ... })
但是遺憾的是,你無法從子類中訪問父類中的屬性:
const Foo = magicMethods(class Foo { __get() { return this.bar() } }) class Bar extends Foo { bar() { return 'value' } } // 這個(gè) *不會(huì)* 調(diào)用 B 的 bar() 方法,而是拋出一個(gè)類型錯(cuò)誤: (new Bar).something
以上就是在 JS 中使用類似 PHP 的魔術(shù)方法的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!