DMQ / mvvm

剖析vue实现原理,自己动手实现mvvm
5.21k stars 1.26k forks source link

关于watcher.js中的一行代码问题 #3

Closed radicalviva closed 7 years ago

radicalviva commented 7 years ago

Dep.target = watcherInstance标记订阅者是当前watcher实例,强行触发属性定义的getter方法 为什么通过获取watcher实例,会触发data里面的属性的getter方法呢? 希望有人帮我解答下呀。

DMQ commented 7 years ago

@radicalviva 简单解释一下,你主要是要理解defineProperty这个方法的含义,以及defineProperty中定义的get方法的执行时机,详见截图 image

radicalviva commented 7 years ago

@DMQ 我在Watch.get方法测试了下,仅保留Dep.target = this而注释掉 var value = this.vm[exp];Dep.target=null;也将触发那个属性的getter方法 这是我不能理解的。

DMQ commented 7 years ago

@radicalviva 在compile.js里面也是有初始化视图需要取值的时候,会触发getter,并不只是在watcher初始化 的时候会触发哈,只需要知道通过defineProperty定义的属性,在取值的时候就会触发getter就行了,有时候不要太砖牛角尖