Proxy与Reflect
Proxy
Proxy 用于修改某些操作的默认行为,可以用来拦截某个对象的属性访问方法,然后重载对象的
“ . ”
运算符。Proxy 可以理解成在目标对象前架设一个“拦截”层,外界对该对象的访问都必须先通过这层拦截,因此提供了一种机制可以对外界的访问进行过滤和改写。
js
let object = new Proxy(
{},
{
get: function (target, key, receiver) {
console.log(`getting ${key}`);
return Reflect.get(target, key, receiver);
},
set: function (target, key, value, receiver) {
console.log(`setting ${key}`);
return Reflect.set(target, key, value, receiver);
},
}
);
object.a = 100; //setting a
console.log(object.a); // getting a 100
- 对比 Object.defineProperty 方法:
js
let object = {};
let value;
Object.defineProperty(object, 'a', {
get: function () {
console.log('getting a');
return value;
},
set: function (newValue) {
value = newValue;
console.log('setting: ' + newValue);
},
enumerable: true,
configurable: true,
});
object.a = 100; //setting 100
console.log(object.a); // getting a 100
Reflect
第一,将 Object 对象的一些明显属于语言内部的方法(如 Object.defineProperty)放到 Reflect 对象上,现阶段,某些方法同时在 Object 和 Reflect 对象上部署,未来新的方法只在 Reflect 对象上部署。也就是说,从 Reflect 对象上可以获得语言内部的方法。
第二,修改某些 Object 方法的返回结果,让其变得更加合理。
第三,让 Object 操作都编程函数行为,某些 Object 操作是命令式,比如 name in obj 和 delete obj [name],而 Reflect.has(obj, name) 和 Reflect.deleteProperty(obj, name) 让它们变成了函数行为。
第四,Reflect 对象的方法与 Proxy 对象的方法一一对应,只要是 Proxy 对象的方法,就能在 Reflect 对象上找到对应的方法,这就是 Proxy 对象可以方便的调用对应的 Reflect 方法来完成默认行为,作为修改行为的基础。也就是说,无论 Proxy 怎么修改默认行为,我们总可以在 Reflect 上获取到默认行为。