page contents

defineProperty和proxy的区别?

轩辕小不懂 发布于 2021-12-30 14:35
阅读 658
收藏 0
分类:WEB前端开发
  • vue
  • 2782
    Nen
    Nen
    - 程序员

    Vue 在实例初始化时遍历 data 中的所有属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。这样当追踪数据发生变化时,

    setter 会被自动调用。

    Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是 Vue 不支持 IE8 以及更低版本浏览器的原因。

    但是这样做有以下问题:

    1. 添加或删除对象的属性时,Vue 检测不到。因为添加或删除的对象没有在初始化进行响应式处理,只能通过$set 来调用、

    Object.defineProperty()处理。

    2. 无法监控到数组下标和长度的变化。

    Vue3 使用 Proxy 来监控数据的变化。Proxy 是 ES6 中提供的功能,其作用为:用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数

    调用等)。相对于Object.defineProperty(),

    其有以下特点:

    1. Proxy 直接代理整个对象而非对象属性,这样只需做一层代理就可以监听同级结构下的所有属性变化,包括新增属性和删除属性。

    2. Proxy 可以监听数组的变化。

    请先 登录 后评论