真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何在javascript中使用魔術(shù)方法?-創(chuàng)新互聯(lián)

JavaScript 魔術(shù)方法

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)永興免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千余家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

這個(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)嘗試訪問(wèn) 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)嘗試通過(guò)調(diào)用 name in instance 來(lái)檢查是否存在 name 是否存在時(shí),調(diào)用該方法。

__unset(name)

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

其他方法

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

static __getStatic(name)

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

static __setStatic(name, value)

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

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

它們不是沒(méi)有必要就是不實(shí)用:

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

__destruct():JavaScript 中沒(méi)有對(duì)象銷(xiāo)毀的鉤子機(jī)制。

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

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

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

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

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

__set_state():JavaScript 中沒(méi)有類似于 var_export() 的東西。

__clone():JavaScript 中內(nèi)置克隆功能的鉤子。

__debugInfo(): 無(wú)法掛接到 console.log() 輸出。

我可以使用魔術(shù)方法擴(kuò)展類嗎?

是的,在一定程度上:

class Bar extends Foo {}
// 或者,如果類 Bar 本身包含魔術(shù)方法:
const Bar = magicMethods(class Bar extends Foo {
  // ...
})

但是遺憾的是,你無(wú)法從子類中訪問(wèn)父類中的屬性:

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)文章!


網(wǎng)頁(yè)標(biāo)題:如何在javascript中使用魔術(shù)方法?-創(chuàng)新互聯(lián)
瀏覽地址:http://weahome.cn/article/spips.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部