1.代理陷阱
代理(Proxy)是一种可以拦截并改变底层js引擎操作的包装器。这些底层操作被拦截后会触发相应特定操作的陷阱函数。
调用new Proxy()可创建代替其他目标对象的代理,对象中方法的默认特性与相同的底层操作一致,代理可以覆写这些操作,每个代理陷阱都对应一个命名和参数都相同的Reflect(反射)方法。如:
let target = {}
let proxy = new Proxy(target, {});
proxy.name = "proxy";
console.log(proxy.name); // "proxy"
console.log(target.name); // "proxy"
target.name = "target";
console.log(proxy.name); // "target"
console.log(target.name); // "target"
以set方法为例:
let target = {
name: "target"
};
let proxy = new Proxy(target, {
set(trapTarget, key, value, receiver) {
if (!trapTarget.hasOwnProperty(key)) {
if (isNaN(value)) {
throw new TypeError("属性必须是数字");
}
}
return Reflect.set(trapTarget, key, value, receiver);
}
});
proxy.name = "proxy";
console.log(proxy.name); // "proxy"
console.log(target.name); // "proxy"
// 不存在的属性赋值会抛出错误
proxy.anotherName = "proxy";
2.可撤销代理
使用Proxy.revocable()创建可撤销代理,返回可被撤销代理对象及撤销代理要调用的函数。如:
let target = {
name: "target"
}
let {proxy, revoke} = Proxy.revocable(target, {});
console.log(proxy.name); // "target"
revoke();
console.log(proxy.name); // 抛出错误