当前位置 博文首页 > 纸飞机博客:Proxy(代理)

    纸飞机博客:Proxy(代理)

    作者:[db:作者] 时间:2021-09-11 16:44

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

    cs
    下一篇:没有了