说到Vue的双向数据绑定,就得提到一种方法,就是数据劫持;Vue就是经过数据劫持,结合发布者-订阅者模式实现的,而此方法实现的核心离不开js中对象的一个方法,即:html
Object.defineProperty(data,'name',{}) //data为要操做的对象 //name对应监听的具体属性名称 //第三个参数未对应属性的描述,及具体怎么样操做对象数据
Object.defineProperty方法用来监听对象中数据的变化,该方法有三个参数,第一个参数为要操做的对象,第二个为要监听对象属性的名称,第三个为属性描述,对应的是个json对象,在里边能够设置get和set方法,当调用属性值或者改变属性值会被get和set方法捕获到,以此进行相关操做。在Vue中,当给Vue对象设置data后,Vue会遍历data对象中的全部属性值,使用Object.defineProperty()方法设置get和set方法,以此实现数据的双向绑定。vue
<html> <body> <input id='enterEl' type='text'> <div id='showEl'></div> <script> let data = {inputValue:'hh'} Object.defineProperty(data,'inputValue',{ get: function(){ return data; }, set: function(newData){ document.getElementById('enterEl').value = newData; document.getElementById('showEl').innerHTML = newData; } }) document.getElementById('enterEl').addEventListener('keyup',function(){ data.inputValue = this.value; }) </script> </body> </html>
<script> //... this.message = 'new Data' console.log(this.$el.textContent) // 仍是原来的消息 this.$nextTick(function(){ console.log(this.$el.textContent) // UI刷新了最新的消息 }) //... </script>