JS高级十二、Proxy-Reflect

1、Proxy

Object.defineProperty(obj, prop, descriptor)
返回值:被传递给函数的对象。

参数
obj要定义属性的对象
prop要定义或修改的属性的名称或Symbol
descriptor要定义或修改的属性描述符

监听对象中的name属性:

let obj = { name:"jerry", age:20 }
Object.defineProperty(obj,"name",{
    get:function(){
        console.log("监听到obj对象的name属性被访问了");
        return "666";
    },
    set:function(){
        console.log("监听到obj对象的name属性被设置了");
    }
})

console.log(obj.name);  //监听到obj对象的name属性被访问了  666
obj.name = "tom";  //监听到obj对象的name属性被设置了

不足:
1、Object.defineProperty设计初衷并不是监听对象中的属性
2、如果对象非常复杂,需要递归去监听,一旦递归,性能非常差
3、有些属性监听不了,如添加属性、删除属性…

ES6引入了Proxy类,如果要监听一个对象的相关操作,可以创建一个代理类,之后该对象的所有操作,都通过代码对象来完成,代理对象可以监听到对原始对象的操作。

let obj = { name:"tom",age:16 }
let objProxy = new Proxy(obj,{
    get:function(target,key){
        console.log(`监听到obj对象的${key}属性被访问了`,target);
        return target[key]
    },
    set:function(target,key,newValue){
        console.log(`监听到obj对象的${key}属性被设置了`,target);
        target[key] = newValue;
    }
})
console.log(objProxy.name);  //tom  监听到obj对象的name属性被访问了 { name: 'tom', age: 16 }
objProxy.name = "jerry";  //监听到obj对象的name属性被设置了 { name: 'tom', age: 16 }
console.log(objProxy.name);  //jerry  监听到obj对象的name属性被访问了 { name: 'jerry', age: 16 }

2、Reflect(ES6)

将原本属于Object身上的api,移植到Reflect身上。

  • Reflect.set(target, propertyKey, value[, receiver])
  • 将值分配给属性的函数。返回一个Boolean,如果更新成功,则返回true。
let obj = {name:"tom"}
let objProxy = new Proxy(obj,{
    get:function(target,key){
        return Reflect.get(target,key)  //替换target[key]
    },
    set:function(target,key,newValue){
        Reflect.set(target,key,newValue)  //Reflect.set
    }
})
objProxy.name = "jerry"
console.log(objProxy.name);  //jerry
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值