zoukankan      html  css  js  c++  java
  • Proxy 相对于 Object.defineProperty 有哪些优点?

    1. Object.defineProperty 无法一次性监听所有属性, Proxy 可以

    const personInfo = {
      name: 'zhangsan',
      age: 18,
      sex: '男'
    }
    const proxy = new Proxy(personInfo, {
      get(target, key) { },
      set(target, key, newValue) { }
    })
    
    Object.keys(personInfo).forEach(key => {
      Object.defineProperty(personInfo, key, {
        set() { },
        get() { }
      })
    })
    

      

    2. Object.defineProperty 无法监听动态新增的属性, Proxy 可以

    const personInfo = {
      name: 'zhangsan',
      age: 18,
      sex: '男'
    }
    
    const proxy = new Proxy(personInfo, {
      get(target, key) {
        console.log('get', key)
      },
      set(target, key, newValue) {
        target[key] = newValue
        return true
      }
    })
    Object.keys(personInfo).forEach(key => {
      Object.defineProperty(personInfo, key, {
        set() { },
        get() { }
      })
    })

    personInfo.from = '上海'

    console.log(proxy) // Proxy 生效 Object.defineProperty 不生效

      

    3. 可以监听删除的属性?

    const personInfo = {
      name: 'zhangsan',
      age: 18,
      sex: '男'
    }
    
    const proxy = new Proxy(personInfo, {
      get(target, key) {
        console.log('get', key)
      },
      set(target, key, newValue) {
        target[key] = newValue
        return true
      }
    })
    
    Object.keys(personInfo).forEach(key => {
      Object.defineProperty(personInfo, key, {
        set() { },
        get() { }
      })
    })
    
    delete personInfo.age
    console.log(personInfo) // proxy 生效 Object.defineProperty不生效
    

     

    4. 可以监听数组的索引和length属性 

    const personInfo = [1, 2, 3, 4]
    
    const proxy = new Proxy(personInfo, {
      get(target, key) {
        console.log('get', key)
        return key in target ? target[key] : undefined
      },
      set(target, key, newValue) {
        target[key] = newValue
        return true
      }
    })
    
    personInfo.forEach((item, index) => {
      Object.defineProperty(personInfo, index, {
        set() { },
        get() { }
      })
    })
    
    
    personInfo[0] = 8 // 都生效
    personInfo[5] = 6 // proxy 生效
    personInfo.push(99) // proxy 生效
    

      

  • 相关阅读:
    两个序列最大子集公共和问题
    两个随机变量相关系数
    多项分布的定义
    算法分析结课总结回溯算法
    潜语义分析LSA相比向量空间模型VSM改变了什么
    类对象的声明和类对象指针的申请的种种
    C#中 常用的方法
    转:GridView鼠标移动行变色 (http://www.cnblogs.com/lovenets/articles/808071.html)[同ceng]
    WinForm 获取指定行列的Value
    华丽丽的分隔符
  • 原文地址:https://www.cnblogs.com/gqx-html/p/14551013.html
Copyright © 2011-2022 走看看