Object.defineProperty-vuejs數據響應基石

https://www.jianshu.com/p/07ba2b0c8fcajavascript

http://www.javashuo.com/article/p-zvktowoy-en.htmlvue

vuejs數據雙向綁定地核心原理就是使用 Object.defineProperty 這個函數來實現數據劫持,並經過publisher-subscriber模型來劫持和使用每個屬性。setter和getter在數據發生變化時publish一個message給subscriber,而且觸發對應地監聽回調被調用。當一個普通地Object做爲vue組件地data時,vue會遞歸枚舉該Object的全部屬性,並使用Object.defineProperty將這些屬性轉變爲getter/setter.用戶並不會感知到getter/stter,可是這些getter/setter卻使得vue能夠跟蹤dependency而且當屬性被訪問或者修改時通知對應的變化。java

vue經過Observer,Compiler和Watcher來實現MVVM的雙向數據綁定。app

1. 經過observer來監控你的model數據變化,函數

2.經過Compile來parse compiler template instructions {{}}post

3. watcher創建observer和compilespa

4. 他們之間的通訊橋樑: Data Change -> View update/View Interaction Change->Data model change雙向綁定

<div id="app">
    <input type="text" id="txt">
    <p id="show"></p>
</div>

<script type="text/javascript">
    var obj = {}
    Object.defineProperty(obj,'txt',{
        get:function () {
            return obj
        },
        set:function (newVal) {
            document.getElementById('txt').value = newVal
            document.getElementById('show').innerHTML = newVal
        }
    })
    document.addEventListener('keyup',function(e){
        obj.txt = e.target.value
    })
</script>
相關文章
相關標籤/搜索