Proxy用于修改某些操作的默认行为,也可以理解为在目标对象之前架设—层拦截,外部所有的访问都必须先通过这层拦截, 因此提供了—种机制,可以对外部的访问进行过滤和修改。这个词意为代理,在这里可以表示由它来”代理”某些操作,译为”代理器”。也可以理解为—个针对对象各种行为的钩子。
语法: let p = new Proxy(target, handler) //target代表需要添加代理的对象 //handler吊来自定义对象中的橾作 校验数据 let Data = { count: 0, amount: 1234, total: 14 }let proxy = new Proxy(Data, { set(target, key, value, proxy) { if (typeof value!=='number') { throw Error("only be numbers"); } return Reflect.set(target, key, value, proxy); } })//抛出错误,Uncaught Error: only be numbersproxy.count= "foo"; //赋值成功proxy.count = 333; 统计函数调用次数 function orginFunction () {}let proxy = new Proxy(orginFunction, { apply (target, thisArg, argumentslist) { log(XXX) return target.apply(thisArg, argumentsList) }}) Proxy支持拦截的操作get
拦截对象属性的读取
set
拦截对象属性的设置
has
拦截propKey in proxy的操作
deleteProperty
拦截delete proxy[propKey]的操作
ownKeys
拦截Object.keys()、for…in循环
getOwnPropertyDescriptor
0bject.getOwnPropertyDescriptor
defineProperty
拦截Object.defineProperty
preventExtensions
拦截Object.preventExtensions
getPrototypeOf
拦截Object.getPrototypeOf
isExtensible
拦截0bject.isExtensible
setPrototypeOf
拦截0bject.setPrototypeOf
apply(target, object, args)
拦截Proxy实例作为函数调用的操作
construct(target, args)
拦截Proxy实例作为构造函数调用的操作