用Proxy代理目标对象,从而实现基本操作的拦截和自定义。
通过使用Proxy构造函数,来生成Proxy实例
let pxy = new Proxy(target,handler)
参数
target 目标对象,可以是对象、数组、函数、set、map、另一个代理,不可以是基本数据类型。
handler 是个对象,用来定制对象的拦截行为,通常以函数作为属性。
若需要再Proxy内调用对象的默认行为,可以使用ES6推荐的 Reflect,它与Proxy的方法、参数是一样的。
handler的拦截操作:
get(目标对象、属性名、实例本身?) 拦截属性的读取
let obj = {name:'tom'}
let pxy = new Proxy(obj,{
get(o,k){
if(k in o){
// return o[k]
return Reflect.get(o, k)
}else {
throw new ReferenceError(`目标对象没有${k}属性`)
}
}
})
pxy.name // tom
pxy.gender // Uncaught ReferenceError:目标对象没有gender属性
set(目标对象、属性名、属性值和、实例本身?) 拦截属性的赋值操作
let pxy = new Proxy(obj, {
set(o, k, v, p) {
// o[k] = v
Reflect.set(o, k, v)
// return true // 严格模式下set代理如果没有返回true就会报错
}
})
apply(目标对象、目标对象上下文、目标对象的参数数组) 拦截函数调用
has(目标对象o、属性名k) 拦截 in 操作符 ==> k in o,返回一个布尔值
ownKeys(目标对象) 拦截对象自身属性的读取操作,比如 for...in、Object.keys()
construct(目标对象,构造函数参数) 拦截 new 操作符
deleteProperty(目标对象、属性名) 拦截 delet 操作符,返回值为true才能完成操作