es6 Proxy理解

用Proxy代理目标对象,从而实现基本操作的拦截和自定义。

通过使用Proxy构造函数,来生成Proxy实例

let pxy = new Proxy(target,handler)

参数

target 目标对象,可以是对象、数组、函数、set、map、另一个代理,不可以是基本数据类型。

handler 是个对象,用来定制对象的拦截行为,通常以函数作为属性。

若需要再Proxy内调用对象的默认行为,可以使用ES6推荐的 Reflect,它与Proxy的方法、参数是一样的。

handler的拦截操作:

get(目标对象、属性名、实例本身?) 拦截属性的读取

let obj = {name:'tom'}
let pxy = new Proxy(obj,{
    get(o,k){
        if(k in o){
             // return o[k]
             return Reflect.get(o, k)
        }else {
            throw new ReferenceError(`目标对象没有${k}属性`)
        }
    }
})
pxy.name // tom
pxy.gender // Uncaught ReferenceError:目标对象没有gender属性

set(目标对象、属性名、属性值和、实例本身?)  拦截属性的赋值操作

let pxy = new Proxy(obj, {
            set(o, k, v, p) {
                // o[k] = v
                Reflect.set(o, k, v)
                // return true // 严格模式下set代理如果没有返回true就会报错
            }
        })

apply(目标对象、目标对象上下文、目标对象的参数数组) 拦截函数调用

has(目标对象o、属性名k) 拦截 in 操作符 ==> k in o,返回一个布尔值

ownKeys(目标对象) 拦截对象自身属性的读取操作,比如 for...in、Object.keys()

construct(目标对象,构造函数参数) 拦截 new 操作符

deleteProperty(目标对象、属性名) 拦截 delet 操作符,返回值为true才能完成操作

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值