当前位置: 首页 > 工具软件 > proxy-test > 使用案例 >

Proxy(代理)

何越
2023-12-01

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

 类似资料: