說到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>