Object.defineProperty 拦截器使用以及实现vue数据拦截

5 篇文章 0 订阅
// Object.defineProperty  es5  vue

// 通过Object.defineProperty定义属性 可以增加拦截器

let obj = {}
let other = '';

Object.defineProperty(obj,'name',{
    enumerable:true,//设置是否可枚举
    configurable:true,//能不能删除这个属性
    get(){//读取方法
        console.log('--------');
        return other;
    },
    set(val){//设置方法
        other = val
    }


// })
obj.name=789
console.log(obj.name);



let obj = {
    other:'123',
    get name(){
        return this.other;
    },
    set name(val){
        this.other = val
    }
}
obj.name = '456'
console.log(obj.name);
// 对象的 setter和getter

// vue的数据劫持 (把所有属性都给成 get 和set方法)
function update(){
    console.log('更新视图');
}
let data = {
    name:'hj',
    age:90,
    adress:{
        location:'昌平'
    }
}
function observer(obj){
   
    if(typeof obj !=='object') return obj;
    for (let key in obj) {
        deineReactive(obj,key,obj[key])
    }
}
function deineReactive(obj,key,value){
    observer(value)
    Object.defineProperty(obj,key,{
        get(){
            return value
        },
        set(val){
            if(val!==value){
                observer(val)
                update()
                value = val
            }
           
        }
    })
}
observer(data);
data.age = 82;
data.adress = [1,2,3];

let methods = ['push','slice','pop','sort','reverse','unshift'];
methods.forEach(method=>{
    let oldMethod = Array.prototype[method];
    Array.prototype[method] = function(){
        update()
        oldMethod.call(this,...arguments)
    }
})
data.adress.push(4)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值