JS每日一題: 如何理解es6中的Proxy?

20190124問:

如何理解es6中的Proxy?前端

試題解析:對proxy的理解,可能會延伸到vue的雙向綁定vue

Proxy(代理) 定義

能夠理解爲爲目標對象架設一層攔截,外界對該對象的訪問,都必須經過這層攔截es6

簡單示例:web

const obj = new Proxy({}, {
     get: (target, key, receiver) => {
         return 'JS'
         console.log(`get ${key}`)
     },
     set: (target, key, value, receiver) => {
         console.log(`set ${key}`)
     },
 })
 
 obj.name = 'JS 每日一題' 
 // set name
 // JS 每日一題
 
 obj.name 
 // 這裏進入get的回調函數,全部直接返回 JS 
複製代碼

從上面的示例中能夠看出,Proxy存在一種機制,能夠對外界的讀寫操做進行改寫緩存

Proxy 實例方法

proxy除了代理get,set操做,還能代理其它的操做,以下安全

handler.getPrototypeOf()

// 在讀取代理對象的原型時觸發該操做,好比在執行 Object.getPrototypeOf(proxy) 時。

handler.setPrototypeOf()

// 在設置代理對象的原型時觸發該操做,好比在執行 Object.setPrototypeOf(proxy, null) 時。

handler.isExtensible()

// 在判斷一個代理對象是不是可擴展時觸發該操做,好比在執行 Object.isExtensible(proxy) 時。

handler.preventExtensions()

// 在讓一個代理對象不可擴展時觸發該操做,好比在執行 Object.preventExtensions(proxy) 時。

handler.getOwnPropertyDescriptor()

// 在獲取代理對象某個屬性的屬性描述時觸發該操做,好比在執行 Object.getOwnPropertyDescriptor(proxy, "foo") 時。

handler.defineProperty()

// 在定義代理對象某個屬性時的屬性描述時觸發該操做,好比在執行 Object.defineProperty(proxy, "foo", {}) 時。

handler.has()

// 在判斷代理對象是否擁有某個屬性時觸發該操做,好比在執行 "foo" in proxy 時。

handler.get()

// 在讀取代理對象的某個屬性時觸發該操做,好比在執行 proxy.foo 時。

handler.set()

// 在給代理對象的某個屬性賦值時觸發該操做,好比在執行 proxy.foo = 1 時。

handler.deleteProperty()

// 在刪除代理對象的某個屬性時觸發該操做,好比在執行 delete proxy.foo 時。

handler.ownKeys()

// 在獲取代理對象的全部屬性鍵時觸發該操做,好比在執行 Object.getOwnPropertyNames(proxy) 時。

handler.apply()

// 在調用一個目標對象爲函數的代理對象時觸發該操做,好比在執行 proxy() 時。

handler.construct()

// 在給一個目標對象爲構造函數的代理對象構造實例時觸發該操做,好比在執行new proxy() 時。

複製代碼

爲何要使用Proxy

  • 攔截和監視外部對對象的訪問
  • 下降函數或類的複雜度
  • 在複雜操做前對操做進行校驗或對所需資源進行管理

題外思考

如何用proxy實現雙向綁定?bash

往期

JS每日一題: 前端的緩存有哪些?都適用什麼場景?區別是什麼?
JS每日一題: Call,Apply,Bind的使用與區別,如何實現一個bind?
JS每日一題: 說說你對前端模塊化的理解
JS每日一題: web安全攻擊手段有哪些?以及如何防範app

關於JS每日一題

JS每日一題能夠當作是一個語音答題社區
天天利用碎片時間採用60秒內的語音形式來完成當天的考題
羣主在第二天0點推送當天的參考答案模塊化

  • 注 毫不僅限於完成當天任務,更可能是查漏補缺,學習羣內其它同窗優秀的答題思路

點擊加入答題函數

相關文章
相關標籤/搜索