Proxy(ES6)深入

2020-11-05  本文已影响0人  Raral

一 Proxy是什么

栗子:

    let person = {
        name:"fsd",
        age:23
    }
    let person2 = new Proxy(person,{
        //target: 目标对象person
        //prop: 代理的属性 name
        //receiver: 代理后的对象 person2
        //value: 设置新的值
        get(target,prop,receiver) {
            console.log(target,prop,receiver)
            //{name: "fsd", age: 23} "name Proxy {name: "fsd", age: 23}
            //拦截后可以增强方法
            console.log(`增强方法比如: i am ${prop}`)
            return target[prop]
        },
        set(target,prop,value,receiver) {

        }
    });
    console.log(person,person2);
    console.log(person == person2)//false
    console.log(person2.name)//fsd

二 Proxy和 Object.defineProperty 区别?

在 Proxy对象出现之前,javascript中提供了Object.defineProperty,允许对对象的getter/setter进行拦截,那么两者的区别在哪里?

  1. Object.defineProperty 无法一次性监听对象所有属性,必须遍历或者递归来实现
  2. Object.defineProperty 无法监听到新增加的属性,而Proxy可以增加的属性,因此vue2.x版本需要通过 vm.set(obj,prop,value)这种形式添加。
  3. Object.defineProperty 无法响应式数组操作,可以监听数组的变化(地址),无法监听到对 数组内置的方法(push shift pop unshift) 进行相应。vue2.x通过重写原型方法来实现相应。
  4. Proxy拦截方式多
  5. Object.defineProperty 兼容性比较好,Proxy 支持不了IE全系列

三 Proxy拦截方法的用法

上一篇 下一篇

猜你喜欢

热点阅读