美文网首页
Vue响应式Object.defineProperty与Prox

Vue响应式Object.defineProperty与Prox

作者: 梦安web开发 | 来源:发表于2023-07-12 22:44 被阅读0次

Object.defineProperty用法

Object.defineProperty()静态方法会直接在一个对象上定义一个新属性,或修改其现有属性,并返回此对象。

Object.defineProperty(obj, prop, descriptor)
参数:
obj:要定义属性的对象。
prop:一个字符串或 Symbol,指定了要定义或修改的属性键。
descriptor:要定义或修改的属性的描述符。

对象新增或者修改属性
let obj = {}
Object.defineProperty(obj, 'sex', {
    value: 42
});
console.log(obj)
进行对象读取或写入值时的监听
let obj = {}
Object.defineProperty(obj, 'sex', {
   get: function(val) {  //访问对象属性时,触发get方法
    console.log(obj)
    obj.sex=2
    return val
  },
  set: function(newVal) { //修改对象属性时,触发set方法
    console.log('set:'+ newVal)
  }
});
console.log(obj.sex)//访问对象属性
监听对象上的多个属性

监听对象需要,通过遍历对象的属性名进行Object.defineProperty绑定,从而实现对象属性的监听。

let obj = {
    name: '',
    sex: 0
}
// 实现一个响应式函数
function defineProperty(obj, key, val) {
    Object.defineProperty(obj, key, {
        get(val) {
            console.log(`访问了${key}属性`)
            return val
        },
        set(newVal) {
            console.log(`${key}属性被修改为${newVal}了`)
            val = newVal
        }
    })
}
// 实现一个遍历函数Observer
function Observer(obj) {
    Object.keys(obj).forEach((key) => {
        defineProperty(obj, key, obj[key])
    })
}
Observer(obj)
console.log(obj.age)
obj.age = 18
console.log(obj.age)

Proxy用法

Proxy是Es6的一个语法,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。new Proxy(target, handler)

var person = {
  name: "张三"
};
var proxy = new Proxy(person, {
  get: function(target, propKey) {
     console.log(propKey+":"+target.name)//name:张三
  },
set: function(obj, propKey, value) {
     console.log(obj)//person的对象
     console.log(propKey)//对象属性名
      console.log(value)//对象属性值
}
});
proxy.name // "张三"
proxy.name ="小明"
proxy.sex="man"

proxy实现监听数据变化,传入目标target对象,不需要通过遍历属性就可以监听对象的变化。

Vue3响应式抛弃Object.defineProperty的原因

1.一次只能对一个属性进行监听,需要遍历来对所有属性监听。

  1. 在遇到一个对象的属性还是一个对象的情况下,需要递归监听。
  2. 对于对象的新增属性,需要手动监听
  3. 对于数组通过push、unshift方法增加的元素,也无法监听

相关文章

  • Vue响应式基本原理

    Vue响应式系统基本原理 Object.defineProperty Object.defineProperty(...

  • 深入 Vue3 源码,学习响应式原理

    Vue2 响应式原理 学过 Vue2 的话应该知道响应式原理是由 Object.defineProperty 对数...

  • Vue 数据双向绑定

    1.响应式原理 Vue的响应式原理依赖于Object.defineProperty,这也是Vue不支持IE8 以及...

  • Vue原理学习(二)

    响应式系统的基本原理 Vue基于Object.defineProperty来实现响应式,对于Object.defi...

  • Vue.js3.0 响应式系统原理

    Vue.js响应式原理回顾 Proxy[https://es6.ruanyifeng.com/#docs/prox...

  • 双向绑定

    数据响应式原理 vue实现数据响应式的原理就是利用了Object.defineProperty(),重新定义了对象...

  • Vue2.x 对比 Vue3.x

    更快 Vue3.x 基于 Proxy 的响应式系统,Vue2.x Object.defineProperty 性...

  • js实用技巧

    vue相关 vue2.x的响应式 实现原理 。对象类型:通过Object.defineProperty()对属性的...

  • Vue 数据响应式

    Vue 数据响应式 getter、setter Object.defineProperty() 该方法会直接在一个...

  • Vue 2.0响应式原理

    Vue 2.0响应式原理:首先把data里的所有属性都用Object.defineProperty定义getter...

网友评论

      本文标题:Vue响应式Object.defineProperty与Prox

      本文链接:https://www.haomeiwen.com/subject/zgpbsdtx.html