可以代理一个对象,对读取、赋值等操作做拦截,从而可额外地做一些事情,对于没有拦截的操作,则按原对象操作调用。
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.getOwnpropertyDescriptor
getPrototypeOf(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();