站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

在 JS 中使用類似 PHP 的魔術(shù)方法

在 JS 中使用類似 PHP 的魔術(shù)方法

JavaScript 魔術(shù)方法

這個腳本使用 Proxy 實現(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ù)方法

給定一個類 Class 和 instance,以下是此腳本支持的魔術(shù)方法:

__get(name)

當(dāng)嘗試訪問 instance[name],而 name 不是 instance 中的屬性時,調(diào)用。

注意: 在 PHP 中,檢查 instance 中是否存在 name 不會使用任何自定義的 __isset() 方法。

__set(name, value)

當(dāng)嘗試使用 instance[name] = …,而 instance 并未設(shè)置 name 屬性時,調(diào)用該方法。

__isset(name)

當(dāng)嘗試通過調(diào)用 name in instance 來檢查是否存在 name 是否存在時,調(diào)用該方法。

__unset(name)

當(dāng)嘗試通過 delete instance[name] 來取消 name 屬性設(shè)置時,調(diào)用該方法。

其他方法

下面的魔術(shù)方法是通過該腳本提供支持的,但不支持在 PHP:

static __getStatic(name)

類似于 __get(),但是它用在 Class 而不是 instance.

static __setStatic(name, value)

類似于 __set(),但是用在 Class 中而不是 instance。

為什么不支持魔術(shù)方法 X?

它們不是沒有必要就是不實用:

__construct() 不需要,JavaScript 早有 constructor。

__destruct():JavaScript 中沒有對象銷毀的鉤子機(jī)制。

__call():與 PHP 相反,方法就像 JavaScript 中的屬性一樣,首先通過 __get() 獲取。要實現(xiàn) __call(),你只需從 get() 返回一個函數(shù)。

__callStatic():與 __call() 類似,但是具有 __getStatic()。

__sleep(),__wakeup():JavaScript 沒有內(nèi)置序列化與反序列化。你可以使用 JSON.stringify() 與 JSON.parse(),但是它們沒有機(jī)制自動觸發(fā)的任何方法。

__toString() 在早有對應(yīng) JavaScript 的 toString()

__invoke():如果你試圖調(diào)用一個非函數(shù)對象,JavaScript 將會拋出一個錯誤,這將無法避免。

__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'   } } // 這個 *不會* 調(diào)用 B 的 bar() 方法,而是拋出一個類型錯誤: (new Bar).something

推薦教程:《JS教程》

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
国产福利专区精品视频| 无码国产精品一区二区免费3p| 国产精品沙发午睡系列| 99久久99久久久99精品齐| 国内精品久久久久影院一蜜桃| 久久国产精品偷99| 国产精品国产三级国产潘金莲| 亚洲日韩中文字幕日韩在线| 女同久久另类99精品国产| 成人啪精品视频免费网站| 国产四虎免费精品视频| 精品久久久久久无码专区不卡| 久久99热只有频精品8| 蜜国产精品jk白丝AV网站| 久久99国产精品久久久 | 国产精品久久久久AV福利动漫| 久久人人爽人人精品视频| 精品无码久久久久久久动漫 | 久久夜色精品国产噜噜| 亚洲国产精品一区二区久久hs| 国产精品无码a∨精品| 精品日产一区二区三区手机| 国语自产精品视频在线观看| 国产午夜精品一本在线观看 | 国内精品久久久久影院老司| 羞羞麻豆国产精品1区2区3区| 热久久视久久精品18| 亚洲日韩精品无码专区加勒比 | 国产成人精品三级麻豆| 国产精品久久久久网站| 国产成人无码精品久久久露脸 | 久久精品国产久精国产思思 | 日韩精品无码人妻一区二区三区| 国产精品一区二区三区高清在线| 国产精品福利一区| 午夜精品福利在线| 精品国产一区二区三区av片| 久久久久久亚洲精品无码| 国产手机精品一区二区| 久久久精品人妻久久影视| 野花国产精品入口|