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 numbers
proxy.count= "foo";
//赋值成功
proxy.count = 333;
function orginFunction () {}
let proxy = new Proxy(orginFunction, {
apply (target, thisArg, argumentslist) {
log(XXX)
return target.apply(thisArg, argumentsList)
}
})
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实例作为构造函数调用的操作