Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。
Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。
方法
get(target, propKey, receiver)
用于 target 对象上 propKey 的读取操作。
set(target, propKey, value, receiver)
用于拦截 target 对象上的 propKey 的赋值操作。
apply(target, ctx, args)
用于拦截函数的调用、call 和 reply 操作。target 表示目标对象,ctx 表示目标对象上下文,args 表示目标对象的参数数组。
has(target, propKey)
用于拦截 HasProperty 操作,即在判断 target 对象是否存在 propKey 属性时,会被这个方法拦截。
construct(target, args)
用于拦截 new 命令。返回值必须为对象。
deleteProperty(target, propKey)
用于拦截 delete 操作,如果这个方法抛出错误或者返回 false ,propKey 属性就无法被 delete 命令删除。
组合使用
Reflect 对象的方法与 Proxy 对象的方法是一一对应的。所以 Proxy 对象的方法可以通过调用 Reflect 对象的方法获取默认行为,然后进行额外操作。
let exam = {
name: "Tom",
age: 24,
};
let handler = {
get: function (target, key) {
console.log("getting " + key);
return Reflect.get(target, key);
},
set: function (target, key, value) {
console.log("setting " + key + " to " + value);
Reflect.set(target, key, value);
},
};
let proxy = new Proxy(exam, handler);
proxy.name = "Jerry";
proxy.name;