0
点赞
收藏
分享

微信扫一扫

Proxy(代理)


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)

}
})

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实例作为构造函数调用的操作


举报

相关推荐

0 条评论