vue2响应式原理及缺点和vue3响应式原理实现

vue2响应式原理:

对象类型:通过Object.defineProperty() 对属性读取、修改进行拦截(数据劫持)

数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)

vue2 响应式实现

复制代码
let person = {
  name: '张三',
  age: 18        
}
let p = {}
Object.defineProperty( p, 'name', {
    get(){ // 有人读取name时调用
      return person.name
    },
    set( value ){ // 有人修改name时调用
      person.name = value
    } 
})
Object.defineProperty( p, 'age', {
    get(){ // 有人读取age时调用
      return person.age
    },
    set( value ){ // 有人修改age时调用
      person.age = value
    } 
})
复制代码

 

vue2 响应式缺点

this.$set( this.objName, 'key', 'value' )  //vue2 对象添加属性
this.$delete( this.objName, 'key' ) // 对象删除属性
this.$set( this.arrayName, 0, 'value' ) // 修改数组索引0的value
或者 this.arrayName.splice( 0, 1, 'value )

vue3的响应式原理:

通过Proxy(代理):拦截对象中任意属性的变化,包括属性值的读写、添加、删除等

通过Reflect(反射):对被代理对象的属性进行操作

详见MDN文档

vue3响应式实现

复制代码
let p = new Proxy(person, {
      get(target, propName) {
        // return target[propName]   js是单线程 用Object.defineProperty一旦报错就挂掉了
        return Reflect.get(target, propName) // 通过Reflect (反射对象) 它身上的defineProperty 去操作 即使出错也不会挂掉
      },
      set(target, propName, value) {
        // target[propName] = value
        Reflect.set(target, propName, value)
      },
      deleteProperty(target, propName) {
        // return delete target[propName]
        return Reflect.deleteProperty(target, propName)
      }
    })
复制代码

 

posted @   无泪的遗憾、愿我能  阅读(140)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示