vue双向绑定解析

function observable(obj){
  if(!obj || typeof obj !== 'object') {
    return;
  }
  let keys = Object.keys(obj);
  keys.forEach((key) => {
    defineReactive(obj,  key, obj[key])
  })
  return obj;
}
class Dep{
    constructor(){
      this.sub = []
    },
    //增加订阅者
    addSub(sub){
      this.subs.push(sub);
    },
    //判断是否增加订阅者
    //通知订阅者更新
    notify(){
      this.subs.forEach((sub) => {
        sub.update();
      })
    }
}
function defineReactive(obj, key, val){
  let dep = new Dep();
  observable(obj)
  Object.defineProperty(obj, key, {
    get(){
      dep.addSub();
      console.log(`${key}属性被读取了`);
      return val;
    },
    set(newVal){
      val = newVal;
      console.log(`${key}属性被修改了`);
      dep.notify();
    }
  }
 }
 let obj = {};
 observable(obj);
全部评论

相关推荐

10-14 10:56
已编辑
长沙学院 嵌入式软件开发
痴心的00后拿到了ssp:hr面挂了,无所谓了反正不去😃
点赞 评论 收藏
分享
河和静子:如果大专也能好过的话,我寒窗苦读几年的书不是白读了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务