久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

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

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

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

      JavaScript 魔術(shù)方法

      這個(gè)腳本使用 Proxy 實(shí)現(xiàn)了在 JavaScript 中使用類(lèi)似于 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è)類(lèi) 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)

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

      static __setStatic(name, value)

      類(lèi)似于 __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() 類(lèi)似,但是具有 __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)有類(lèi)似于 var_export() 的東西。

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

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

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

      是的,在一定程度上:

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

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

      const Foo = magicMethods(class Foo {   __get() {     return this.bar()   } }) class Bar extends Foo {   bar() {     return 'value'   } } // 這個(gè) *不會(huì)* 調(diào)用 B 的 bar() 方法,而是拋出一個(gè)類(lèi)型錯(cuò)誤: (new Bar).something

      推薦教程:《JS教程》

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)