欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

object.defineproperty 和 proxy 的区别

程序员文章站 2022-07-12 21:54:30
...

什么是Proxy

Proxy是ES6推出的一个类,给对象架设一层拦截器,但凡要访问或者修改这个对象上的值或者属性,都必须先经过这层拦截器, Proxy也叫代理器, 它代理了对对象的操作

什么是Object.defineProperty

Object.defineProperty是对对象上的属性进行新增或者修改

Proxy的优势如下

  • Proxy可以直接监听整个对象而非属性。
  • var newProxyObj = {name: 'chrome', age:'0'}
    var proxyObj = new Proxy(newProxyObj, {
        set(target, key, value, receiver) {
            consnole.log('proxy改了', key, value)
        }
    })
    proxyObj.name = 'google'; // proxy修改了 name google

  • Proxy可以直接监听数组的变化。
  • Proxy有13中拦截方法,如ownKeys、deleteProperty、has 等是 Object.defineProperty 不具备的。
  • Proxy返回的是一个新对象,我们可以只操作新的对象达到目的,而Object.defineProperty只能遍历对象属性直接修改;
  • Proxy做为新标准将受到浏览器产商重点持续的性能优化,也就是传说中的新标准的性能红利。

Object.defineProperty 的优势如下

  • 兼容性好,支持 IE9,而 Proxy 的存在浏览器兼容性问题,而且无法用 polyfill 磨平。
  • const obj = {
        name: 'chrome'
    }
    // 数据描述符
    Object.defineProperty(obj, 'age', {
        configurable: true, // 这个定义是否可以被delete
        enumerable: true, // 这个值是否可以被for in 枚举,或者Object.keys获取到
        writable: true, // 定义是否可以被修改
        value: '100'
    })
    // 访问器描述符
    Object.defineProperty(obj, 'child', {
        configurable: true,
        enumerable: true,
        set(value) {
            console.log(value)
        },
        get() {
            console.log(this.value)
        }
    })

Object.defineProperty 不足在于

  • Object.defineProperty 只能劫持对象的属性,因此我们需要对每个对象的每个属性进行遍历。
  • Object.defineProperty不能监听数组。是通过重写数据的那7个可以改变数据的方法来对数组进行监听的。
  • Object.defineProperty 也不能对 es6 新产生的 Map,Set 这些数据结构做出监听。
  • Object.defineProperty也不能监听新增和删除操作,通过 Vue.set()和 Vue.delete来实现响应式的。