VUE2的响应式原理中所用的Object.defineProperty的缺点

我们都知道vue2响应式原理是通过Object.defineProperty来实现的,通过劫持各属性的setter和getter,监听数据的变化。

Object.defineProperty 的缺点

  1. 无法监听对象属性的新增和删除
    let num = 3
    const cat = {
    	name: '大橘',
    	sex: 'boy',
    	age: 5
    }
    Object.defineProperty(cat,'age',{
    	get() {
    		console.log('get value')
    		return num
    	},
    	set(val) {
    		console.log('set value', val)
    		num = val
    	}
    })
    cat.age = 6 // 可以被监听到
    cat.breed = '狸花猫' // 无法被监听到
    
    解决方式
    新增属性
    this.$set(this.obj, 'a', 'abc')
    
    删除属性
    this.$delete(this.obj, 'a')
    
  2. 无法监听数组下标的变化,通过数组下标修改元素,无法实时响应。基于性能考虑vue2放弃了Object.defineProperty这一特性,如果数组长度过大,比如1000条,性能代价和用户体验收益不成正比 参考
    push()
    pop()
    shift()
    unshift()
    splice()
    sort()
    reverse()
    
  3. 只能劫持对象的属性,所以我们需要对每个对象的所有属性进行遍历,然后需要深拷贝进行修改
    Proxy可以监听对象而非属性,相比前者具有更好的性能
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值