何為proxy
Proxy 對象用于定義或修改某些操作的自定義行為,可以在外界對目標對象進行訪問前,對外界的訪問進行改寫。
var proxy = new Proxy(target, handler)
ES6 中的proxy目前提供了13種可代理操作攔截的行為。
何為reflect
ES6 標準中,將許多原本屬于?Object?對象的方法轉移到了?Reflect?對象上
把所有對對象的操作轉義到Reflect上。可以將 Reflect 視為一種封裝了底層操作的 API。
Reflect.get(target, propertyKey[, receiver])
//同等于
target[name]Reflect.deleteProperty(target, propertyKey)
//同等于
delete target[name]
在一些舊方法執行錯誤時,只能通過try…catch去拿到,而reflect執行錯誤會返回false
try {Object.defineProperty(target, property, attributes);
} catch(e) {// 失敗
}// 新寫法
if (Reflect.defineProperty(target, property, attributes)) {// success
} else {// failure
}
Reflect 的作用是提供了一種統一且易于理解的方式來執行底層操作,而不是直接操作對象。這樣可以保持代碼的一致性和可讀性,并且避免了直接操作底層方法可能引發的一些問題。
Reflect的好處
統一性:Reflect 提供了一組方法,與底層操作一一對應,使得代碼更加統一和易于理解。
可讀性:使用 Reflect 的方法可以使代碼更加清晰,減少了直接操作底層方法可能引發的一些問題,并且可以直接看到操作的意圖。
安全性:使用 Reflect 的方法可以避免一些潛在的問題,如在嚴格模式下直接使用 delete 可能會拋出錯誤,而 Reflect.deleteProperty 則會返回一個布爾值表示是否刪除成功。
二者結合的好處
Proxy 的攔截器方法中可以調用 Reflect 的對應方法來實現默認行為或者在默認行為的基礎上進行修改。例如,在 Proxy 的 get 攔截器中,可以使用 Reflect.get 方法來獲取原始對象的屬性值,并對其進行修改或返回。
let handler = {get: function(target, key, receiver) {return 1},set: function (target, key, value, receiver) {console.log(`setting ${key}!`);return Reflect.set(target, key, value, receiver);}
}
var obj = new Proxy({}, handler)
obj.a = 5 // setting 5!
console.log(obj.a) // 1
總結
Proxy 和 Reflect 是相輔相成的,通過結合使用它們可以實現更靈活和強大的代理功能,并且使用 Reflect 可以更好地管理和執行底層操作。