ES6中Proxy的使用

Proxy:代理

作用:预警、上报、扩展功能、统计、增强对象等等
是设计模式的一种,代理模式
语法

        new Proxy(target,handler)
        //target:被代理的对象
        //handler:对代理的对象做什么操作

handler:{
set(){};//设置的时候干的事情
get(){};//获取的时候干的事情
deleteProperty(){};//删除
has(){};//有没有这个东西
apply(){};//调用函数处理

}
例1

  let obj = {//此对象不给用户暴露
            name : 'yang'
        }
        let newObj = new Proxy(obj,{//obj被代理
            get(target,property){
               return target[property];
            }
        })
        console.log(newObj.name);//yang

例2:实现访问一个对象身上属性,默认不存在的时候返回undefined,希望如果不存在返回错误(警告)信息

    let obj = {
            name : 'yang'
        }
        let newObj = new Proxy(obj,{
            get(target,property){
               if(property in target){
                   return target[property];
               }else{
                   throw new ReferenceError(`${property}不在此对象上`)
               };
            }
        })
      console.log(newObj.name);//yang
      console.log(newObj.age);//ReferenceError: age不在此对象上

例3:实现以下功能
DOM.div():创建一个div
DOM.ul():创建一个ul
DOM.a():创建一个a

        const DOM = new Proxy({},{
            get(target,property){
                return  function(attr={},...children){
                    const el = document.createElement(property);
                    //添加属性
                    for(let key of Object.keys(attr)){
                        el.setAttribute(key,attr[key]);
                    }
                    //添加子元素
                    for(let child of children){
                        if(typeof child == 'string'){
                            child = document.createTextNode(child);
                        }
                        el.appendChild(child);
                    }
                    return el;
                }
            }
        });
        let oDiv = DOM.div({id:'div'},'div','呵呵呵')
        window.onload = function(){
            document.body.appendChild(oDiv);
        }
        

Reflect :反射

可以通过Reflect对象身上直接拿到语言内部的东西
‘assign’ in Object可以写成 Reflect.has(Object,'assign);
delete json.a 可以写成 Reflect.deleteProperty(json,‘a’);

Reflect.apply(调用的函数,this指向,参数)

        function sum(a,b){
            return a + b;
        }
        let newSum = new Proxy(sum,{
        	//拦截方法
            apply(target,context,argus){
                return  Reflect.apply(...arguments);
            }
        })
        console.log(newSum(2,3));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值