Proxy和Reflect

作者: 姜治宇 | 来源:发表于2023-02-26 11:38 被阅读0次

    Proxy

    Proxy可以监听到对象内部操作的变化,比如对象或数组的增查改删。
    相对于Object.defineProperty,最大的优势是它可以监听到数组的长度变化。
    有了Proxy,使得vue3的源码简洁了不少。

    const arr = [];
    //用Proxy包装数组或对象,使之内部操作可以被监听到
    const proxyArr = new Proxy(arr,{
        get(target,propName){
            console.log('get',target,propName);
            return target[propName];
        },
        set(target,propName,value){
            console.log('set',target,propName,value);
            target[propName] = value;
            return true;
        },
        deleteProperty(target,propName){
            console.log('delete',target,propName);
            return delete target[propName]
        }
    });
    setTimeout(()=>{
        proxyArr.push('hello');
    },1000);
    setTimeout(()=>{
        proxyArr.splice(0,1);
    },2000);
    

    Reflect

    Reflect就是反射的意思,还是一些对象内部的方法,比如get、set、deleteProperty、defineProperty等,可以放在Reflect这个全局对象上访问到。

    const arr = [];
    //用Proxy包装数组或对象,使之内部操作可以被监听到
    const proxyArr = new Proxy(arr,{
        get(target,propName){
            console.log('get',target,propName);
            return Reflect.get(target,propName);
        },
        set(target,propName,value){
            console.log('set',target,propName,value);
            Reflect.set(target,propName,value);
            return true;
        },
        deleteProperty(target,propName){
            console.log('delete',target,propName);
            return Reflect.deleteProperty(target,propName);
        }
    });
    setTimeout(()=>{
        proxyArr.push('hello');
    },1000);
    setTimeout(()=>{
        proxyArr.splice(0,1);
    },2000);
    

    相关文章

      网友评论

        本文标题:Proxy和Reflect

        本文链接:https://www.haomeiwen.com/subject/lttcldtx.html