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);