概述
Proxy(代理),可以理解成,在目标对象之前架设一层(拦截),外界对对象的访问都必须先通过这层拦截,通过这种代理操作的机制,可以对外界的访问进行过滤和修改。
let person={name:'lilei'}
let obj=new Proxy(person,{
get:function(target,key,receiver){
if(key in target) return target[key]
else return '暂无该值!'
}
})
obj.name //'lilei'
obj.age // '暂无该值!'
Proxy实例通过Proxy构造函数生成
var proxy=new Proxy(target,handler)
target是要拦截的对象
handler参数也是个对象,用来定制拦截行为,如果handler没有设置任何拦截,等同于直接通向原对象。
Proxy实例可以作为其他对象的原型对象
var proxy=new Proxy({name:1},{})
var obj=Object.create(proxy)
obj.name //1
拦截操作
1、get(target, propKey, receiver) 拦截对象属性的读取
2、set(target, propKey, value, receiver) 拦截对象属性的设置 返回一个布尔值
3、has(target, propKey) 拦截propKey in proxy
的操作,返回一个布尔值
4、deleteProperty(target, propKey) 拦截delete proxy[propKey]
的操作,返回一个布尔值。
5、ownKeys(target) 拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)
for...in循环,返回一个数组。该方法返回目标对象所有自身的属性的属性名,而Object.keys()
的返回结果仅包括目标对象自身的可遍历属性。
6、getOwnPropertyDescriptor(target, propKey) 拦截Object.getOwnPropertyDescriptor(proxy, propKey)
,返回属性的描述对象。
7、defineProperty(target, propKey, propDesc) 拦截Object.defineProperty(proxy,propKey, propDesc)、 Object.defineProperties(proxy, propDescs),返回一个布尔值。】
8、preventExtensions(target) 拦截Object.preventExtensions(proxy)
,返回一个布尔值。
9、getPrototypeOf(target) 拦截Object.getPrototypeOf(proxy)
,返回一个对象。
10、isExtensible(target) 拦截Object.isExtensible(proxy)
,返回一个布尔值。
11、setPrototypeOf(target, proto) 拦截Object.setPrototypeOf(proxy, proto)
,返回一个布尔值。如果目标对象是函数,那么还有两种额外操作可以拦截。
12、apply(target, object, args) 拦截 Proxy 实例作为函数调用的操作,比如proxy(...args)
、proxy.call(object, ...args)
、proxy.apply(...)
。
13、construct(target, args):拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)
。