ES6 -Proxy & Reflect

1.Proxy:代理

扩展(增强)对象或方法的一些功能
作用:vue中拦截,预警,上报,扩展功能,统计,增强对象等
proxy 是设计模式一种,代理模式
 
语法
new Proxy(target,handler)
new Proxy(被代理的对象,对代理对象做什么操作)

handler={
set(){},//设置
get(){},//获取对象属性
deleteProperty(),//删除
has(),//是否存在这个属性
apply(),//调用函数处理
}
 
// 访问name之前,打印访问的属性名称
let obj={
    name:'aaa',
}
let newobj=new Proxy(obj,{
    // target:obj ,property:访问的属性
    get(target,property){
        console.log(target,property);//{name: "aaa"} "name"
        console.log(`访问了${property}属性`);//访问了name属性
        return target[property];
    }
});

console.log(newobj.name);//aaa

 

// 实现一个,访问一个对象的属性,默认不存在的时候返回undefined,
// 如果不存在提示警告信息

let obj={
    name:'aaa'
}
let newobj=new Proxy(obj,{
    get(target,property){
        if(!target[property]){
            // throw new Error(`${property}属性不在此对象上`);
            return 'fail'
        }
        return target[property];
    }
})
console.log(newobj.name);//aaa
console.log(newobj.as);//fail

 

// DOM.div()

const DOM=new Proxy({},{
    get(target,property){
        console.log(target,property);//{} "div"
        return function(attr={},...argus){
            console.log(attr,argus);//{id: "div1", class: "box"} (2) ["aaa", "123"]
            const el=document.createElement(property);
            // 添加属性
            for(let key of Object.keys(attr)){
                el.setAttribute(key,attr[key]);
            }
             // 添加子元素
            for(let value of argus){
                if(typeof value=='string'){
                    value=document.createTextNode(value);
                }
                el.appendChild(value);

            }
            return el;
        }
    }
});

let oDiv=DOM.div({id:'div1',class:'box'},'aaa','123',DOM.a({'href':'www.baidu.com'},'链接'));

console.log(oDiv);// <div id="div1" class="box">aaa123<a href="www.baidu.com">链接</a></div>

 

// set() 设置,拦截:设置一个年龄,整数且不超过 200
let obj=new Proxy({},{
    set(target,prop,value){
        console.log(target,prop,value);//{} "age" 1
        if(prop=='age'){
            if(!Number.isInteger(value)){
                throw new TypeError('必须为整数')
            }
            if(value>200||value<1){
                throw new RangeError('必须在1-200之间')
            }
        }
        target[prop]=value;
    }
});

obj.age=1;//{} "a" 123

 

// deleteProperty():删除,拦截

// has() 检测

let json={a:1,b:2}

let newJson=new Proxy(json,{
    deleteProperty(target,prop){
        console.log(target,prop);//{a: 1, b: 2}  "a"
        delete target[prop]
    },
    has(target,prop){
        console.log(target,prop);//{b: 2} "b"
        return prop in target;
        
    }

});

delete newJson.a;

console.log(newJson.a);//undefined

console.log('b' in newJson);//true

 

// apply() 拦截方法

function fn(){
    return 123;
}

let newFn=new Proxy(fn,{
    apply(){
        return 456;
    }
})

console.log(newFn());//456

2. Reflect 反射

  Reflect.apply(调用的函数,this指向,参数数组)
 
function sum(a,b){
    return a+b;
}

let newSum=new Proxy(sum,{
    // target:sum ,context:this指向,argus:参数
    apply(target,context,argus){
        console.log(target,context,argus);//== console.log(...arguments);
        return Reflect.apply(...arguments);
    }
});

console.log(newSum(2,3));//5

 

// 通过Reflect对象身上直接拿到语言内部东西

// Reflect.has()
console.log('assign' in Object);//true
console.log(Reflect.has(Object,'assign'));//true

// Reflect.deleteProperty()
let obj={a:1,b:2};
Reflect.deleteProperty(obj,'a');//== delete obj.a
console.log(obj);//{b: 2}

 

转载于:https://www.cnblogs.com/yuesu/articles/9582876.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于"vue3proxy结合reflect"的问题,我理解你可能想了解如何在Vue 3中使用Proxy与Reflect结合起来。Vue 3是一个流行的JavaScript框架,而Proxy和Reflect则是ES6中新增的特性。 在Vue 3中,可以使用Proxy对象来代理Vue实例,以便捕获对数据的访问和修改。Proxy对象可以拦截并处理对Vue实例的操作,比如读取、设置和删除属性等。而Reflect对象提供了一组用于操作对象的方法,比如Reflect.get()、Reflect.set()和Reflect.deleteProperty()等。 结合使用Proxy和Reflect可以提供更灵活的控制和监控能力。你可以通过在Vue实例上创建一个代理对象,来拦截对数据的访问和修改,并在代理处理器中使用Reflect方法来操作实际的数据。这样可以轻松地实现对数据的拦截、校验、代理等功能。 下面是一个简单的示例代码,展示了如何在Vue 3中使用Proxy和Reflect结合起来: ```javascript const data = { message: 'Hello, Vue!', }; const proxy = new Proxy(data, { get(target, key) { console.log('Getting ' + key); return Reflect.get(target, key); }, set(target, key, value) { console.log('Setting ' + key + ' to ' + value); return Reflect.set(target, key, value); }, }); // 创建Vue应用 const app = Vue.createApp({ data() { return proxy; // 使用代理对象 }, }); app.mount('#app'); ``` 在上面的代码中,我们创建了一个名为data的普通对象,并使用Proxy对象创建了一个代理对象proxy。在代理对象的get和set处理器中,我们分别使用Reflect.get和Reflect.set来操作实际的数据。这样,当我们通过Vue实例访问或修改数据时,会触发代理处理器,并通过Reflect方法操作实际的数据。 希望这个例子能帮助到你,如果还有其他问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值