首頁  >  文章  >  web前端  >  在 JS 中使用類似 PHP 的魔術方法

在 JS 中使用類似 PHP 的魔術方法

Guanhui
Guanhui轉載
2020-05-23 10:39:242811瀏覽

在 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中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除