关于JS代理劫持扩展属性修改新老对比

       关于代理劫持扩展属性修改,ES5标准中利用Object.defineProperty()方法进行修改,理解起来较为晦涩,代码量较大。而ES6标准引入Proxy内建对象,是一种可以拦截并改变底层JS引擎的包装器,让代理劫持扩展属性修改简单易理解。

一、ES5代理劫持扩展属性修改

       let data={//被劫持对象定义

              userName:"张小玉",

              age:34,

              address:"成都市"

       };

       let  _this={ };//代理对象

       for(let item in data){

              Object.defineProperty(_this,item,{ //利用object.defineproperty()进行

                     get(){//get()方法用来获取扩展属性值

                            console.log("触发get()");

                            return data[item];

                     },

                     set(newVlue){//监视扩展性的,只要一修改就调用,newVlue为待修改的值

                     console.log("触发set()",newVlue);//输出结果:触发set() 孙小小

                     // _this.userName="孙小小";//千万不要在set方法中直接修改扩展性值,否则会造成死循环

                     data[item]=newVlue;//无法set直接修改,但可以间接修改

                 }

              });

       };

console.log(_this);//输出结果:张小玉,此为修改前

//通过Object.defineProperty的get方法获得的属性值,不能直接用对象.属性去修改,但是会触发set方法

_this.userName="孙小小";//修改劫持的扩展属性

console.log(_this.userName);//输出结果:孙小小,此为修改后

二、ES6代理劫持扩展属性修改

    let data={//被劫持对象定义

              userName:"张小玉",

              age:34,

              address:"成都市"

       };

       let _this1=new Proxy(data,{ });//利用Proxy定义代理对象,Proxy有两个参数,第一个是目标target,第二个是处理程序handler。

       console.log(_this1); //输出结果:张小玉,此为修改前

       _this1.userName="田小丽";//修改劫持的扩展属性

       console.log(_this1); //输出结果:田小丽,此为修改后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值