vue双向数据绑定与抽象语法树
双向数据绑定原理
// 数据劫持/数据代理
object.defineProperty()
数组通过改写数组中push,pop,shift,unshift,splice,sort,reverse等方法实现数组的双向绑定。
vue的双向数据绑定,是采用数据劫持结合发布者和订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调,getter函数里面执行的任务是watcher订阅者, 而setter函数执行的任务是发布者
抽象语法树(ast)
抽象语法树的本质上是一个JS对象,Vue在审视所有HTML结构时是以字符串的形式进行的,最终将其解析为JS对象。AST抽象语法树服务于模板编译,将一种语法翻译为另一种语法。在Vue中将模板语法编译为HTML语法,自己作为中转站。
抽象语法树和虚拟节点的关系
模板语法会变成抽象语法树AST,而抽象语法树最后不会变成虚拟节点,而是会直接变成渲染函数(h函数),h函数的执行会变成虚拟节点,虚拟节点经过diff 会在界面上显示。也就是说抽象语法树是不会 diff 的,diff 是用虚拟节点 diff 的,抽象语法树也不是直接生成 虚拟节点 的。