16说一下,Vue实现数据双向绑定Object.defineProperty()的原理?然后使用js实现简单的双向绑定
vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调。当把一个普通Javascript对象传给Vue实例来作为它的data选项时,Vue将遍历它的属性,用Object.defineProperty将它们转为getter/setter。用户看不到getter/setter,但是在内部它们让Vue追踪依赖,在属性被访问和修改时通知变化。vue的数据双向绑定将MVVM作为数据绑定的入口,整合Observer,Compile和Watcher三者,通过Observer来监听自己的model的数据变化,通过Compile来解析编译模板指令(vue中是用来解析{{}}),最终利用watcher搭起observer和Compile之间的通信桥梁,达到数据变化—>视图更新;视图交互变化(input)—>数据model变更双向绑定效果。<body><divid="app"><inputtype="text"id="txt"><pid="show"></p></div></body><scripttype="text/javascript">varobj={}Object.defineProperty(obj,'txt',{get:function(){returnobj},set:function(newValue){document.getElementById('txt').value=newValuedocument.getElementById('show').innerHTML=newValue}})document.addEventListener('keyup',function(e){obj.txt=e.target.value})</script>
来自:vue.js-vue重排与重绘-diff