一文大白话讲清楚ES6代理Proxy和反射Reflect

一文大白话讲清楚ES6代理Proxy和反射Reflect

1. 你当过老板么

  • 老板很忙,很多事自己忙不过来,怎么办,找一个秘书,给秘书授权,以他的名义去做事。
  • 那简单了,老板能做的我都能做,这就是代理
  • 我做完了,总得汇报给老板,让老板信息同步吧,好嘛,这就是反射
  • 回到js,我们有一个对象A,不直接操作对象A,而是找来B,让B成为A的代理,然后去操作B。B操作完了再去同步到A。这就是代理和反射

2.代理Proxy

  • 用于定于对象基本操作的自定义行为
  • 说白了,就是修改程序的默认行为,想好比在编程语言层面上做修改,属于元编程
  • 再简单点理解,就是把操作对象的底层方法进行覆写
  • 啥意思,就是假设有一个对象,obj={name:‘tom’},正常情况下我们obj.name就能获取到tom。但是我现在不想获取到tom,我让obj.name干点别的,行不行,行,比如让obj.name返回shift
  • 上代码
let obj={
   
   
    name:'tom'
}
// 用proxy代理obj
let proxy=new Proxy(obj,{
   
   
    //proxy.name的返回值
    get(target,name,reciever){
   
   
        return 'shift'
    }
})
console.log(obj.name)//tom
console.log(proxy.name)//shift
  • 明白了吧,proxy的任务就是代理obj,
  • 那都能代理obj的哪些方法呢

2.1 get(target,propKey,receiver)//获取对象的属性

  • 上面举了例子了

2.2 set(target,propKey,newValue,receiver)//设置属性的值

let obj={
   
   
    name:'tom'
}
let proxy=new Proxy(obj,{
   
   
    set(target,propKey,newValue,reciever){
   
   
        //如果设置proxy.name,就执行下边这句话,把obj.name改为'hahaha'
        target[propKey]='hahaha'
    }
})
proxy.name='new Tom'//这里设置name的新值为newTOm
console.log(proxy.name)//hahaha,但最终打印出来的是hahaha

2.3 has(target,propKey)//代理查询属性操作,propKey in obj的操作

let obj={
   
   
    name:'name'
}
let proxy=new Proxy(obj,{
   
   
    has(target,propKey){
   
   
        if(propKey==='age'){
   
   
            return true
        }
    }
})
console.log(age in obj)//false,obj里面没有age属性,所以返回false
console.log(age in proxy)//true,proxy里面也灭有age,但是我们拦截覆写了has方法,让他返回rue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许先森森

爱我就打我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值