使用Object.defineProperty实现数据的绑定通知

  class Dep{
        constructor(){
          this.subs = [];
        }
        addSub(sub){
          this.subs.push(sub);
        }
        notify(){
          this.subs.forEach(sub => {
            sub.update();
          })
        }
      }
      Dep.target = null;
      class Watch{
        constructor(obj,key,cb){
          Dep.target = this;
          this.cb = cb;
          this.obj = obj;
          this.key = key;
          this.val = obj[key];
          Dep.target = null;
        }
        update(){
          this.val = this.obj[this.key];
          console.log(1111)
          this.cb(this.val);
        }
      }

      let data = {
        name:'krysliang',
      };
      observe(data);
      new Watch(data,'name',()=>{
        console.log('监听到数据发生变化')
      })
      data.name = 'hhh';

      function defineReactive(obj,key,val){
        observe(val);//将属性值也监听一下 
        let dp = new Dep();
        Object.defineProperty(obj,key,{
          enumerable:true,
          configurable:true,
          get:function reactiveGetter(){
            console.log('监听到有人获取数据拉');
            if(Dep.target){
              dp.addSub(Dep.target);
            }
            return val;
          },
          set:function reactiveSetter(newVal){
            console.log('监听到有人设置数据拉')
            val = newVal;
            dp.notify();
          }
        })
      }
      function observe(obj){
        if(!obj || typeof obj !=="object"){
          return;//非对象不往下执行
        }
        Object.keys(obj).forEach(key => {
          defineReactive(obj,key,obj[key]);
        })
      }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值