响应式系统:
最开始,在getter和setter中写死了我们的console,但是想要执行用户写的自定义函数,该怎样去实现呢?
首先,需要有一个筐去把用户传过来的回调函数在我们的getter中收集起来,然后在setter中去通知这些回调函数一个一个执行。
代码思路:首先我们先去写了一个dep的类(可以理解为筐),dep类中有两个方法,分别是depend()【收集依赖】和notify()【通知watcher中的run()函数执行】。接着写了一个watcher类,我们把回调函数抽象为一个watcher实例,首先我们需要把这些watcher实例放到一个公共的地方(dep类的静态属性上)让depend去收集。
Watcher类中有两个方法:get()和run()方法
Get():在求属性值之前,先把这个watcher实例自身放在dep.target这个属性上(公共的地方),然后再去对我们需要观测的属性进行求值。求值的时候就会触发getter中的dep.depend()方法。Depend执行之后,就会去这个公共的地方去看 当前是谁?是哪个watcher?然后就把这个watcher实例push到自己的数组(dep类中的this.subs数组)里面去
Run()方法最核心的代码就是:this.cb.call(this.vm),谁去触发这个函数呢?是通过数字一旦改变,setter函数中就会调用dep.notify(),然后notify触发run()这个函数。把sub里面全部的watcher实例全部拿出来一个一个run了一次,因为一个属性有可能会对应多个回调函数