读书笔记(三十二):代理与反射

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); // 抛出错误
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值