91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在javascript中使用魔術方法?

發布時間:2020-05-23 11:41:38 來源:億速云 閱讀:343 作者:鴿子 欄目:web開發

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 中使用類似 PHP 的魔術方法的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南充市| 秦皇岛市| 泰顺县| 大港区| 法库县| 望江县| 廉江市| 雷波县| 海城市| 都江堰市| 古田县| 辽宁省| 昌黎县| 石屏县| 固始县| 平潭县| 五家渠市| 拜城县| 汝城县| 永登县| 普格县| 廊坊市| 桃源县| 电白县| 宕昌县| 湾仔区| 碌曲县| 清镇市| 长寿区| 富川| 双柏县| 浠水县| 大埔县| 濮阳县| 东乡县| 黄浦区| 印江| 彰武县| 砚山县| 晋城| 云梦县|