可以代理一个对象,对读取、赋值等操作做拦截,从而可额外地做一些事情,对于没有拦截的操作,则按原对象操作调用。
let p = new Proxy(target, handler);
通过 handler 来提供以下方法(this 指向 代理后的对象,该对象的 [[handler]] 指向 handler):
get(target, prop, receiver)拦截属性读取操作set(target, prop, val, receiver)拦截设置属性值操作has(target, prop)可以看作是对in的操作的拦截apply(target, thisArg, args)拦截函数的调用,包括普通调用和apply和call等。construct(target, args, newTarget)拦截new操作符defineproperty(target, prop, descriptor)拦截Object.defineProperty的操作deleteProperty(target, prop)拦截delete操作getOwnPropertyDescriptor(target, prop)拦截Object.getOwnpropertyDescriptorgetPrototypeOf(target)拦截原型对象的读取,包括Object.getPrototypeOf()、__proto__以及instanceof等isExtensible(target)拦截Object.isExtensible()ownKeys(target)拦截Object.getOwnPropertyNames()以及Object.keys()等preventExtensions(target)拦截Object.preventExtensions(obj)setPrototypeOf(target, proto)拦截Object.setPrototypeOf
receiver,Proxy 或继承 Proxy 的对象,最初被调用的对象,通常就是 proxy 自身。但如果对象本身无该属性,原型链上有 Proxy 对象,那么这时对象本身就作为 receiver 参数传进来了。1
不仅使用于 Object,也使用于 Reflect,拦截具体对应的操作可能有所区别
Proxy.revocable(target, handler) 创建一个 proxy 并返回撤销该 proxy 的方法。
const { proxy, revoke } = Proxy.revocable(target, handler);
// .. do something with proxy
// 撤销代理
revoke();