學習原文地址:淺探VUE的MVVM模式實現
html
一、MVVM模式思想vue
MVVM模式的思想:關注model(數據)的變化,讓MVVM框架去自動更新DOM,實現方法主要是數據劫持結合發佈訂閱模式。node
二、核心方法Object.defineProperty設計模式
Object.defineProperty是用來數據劫持的關鍵方法,vue框架是不兼容IE6~8低版本的,主要是由於它的用到了ES5中的這個Object.defineProperty的方法,並且這個方法暫時沒有很好的降級方案。
數組
該方法接收三個參數,並且都是必填的。數據結構
第一個參數:目標對象。app
第二個參數:須要定義的屬性或方法的名字。框架
第三個參數:目標屬性所持有的特性。dom
經過Object.defineProperty這個方法,能夠對引用數據實現監聽,獲取和修改值時分別調用get和set方法。mvvm
三、數據劫持
能夠看到對咱們所定義的data中的數據都已經有了get和set方法了,到這裏咱們對data中數據的變化都是能夠監聽的到了。
四、數據代理
下面咱們來實現讓咱們的實例this來代理( _data)數據,從而實現 myvue.name 這樣的操做能夠直接獲取到數據。
以上代碼實現了數據代理,思想:就是在構建實例的時候,把data中的數據遍歷一遍,依次加到this上,加的過程不要忘記添加Object.defineProperty,只要是數據咱們都須要添加監聽。
沒有實現代理前:
能夠經過vm._data訪問
不能經過vm.直接訪問
實現代理後
五、編譯模板(Compile)
咱們已經完成對數據的劫持,也實現了this對數據的代理,name接下來作的是怎麼把數據編譯到咱們的dom節點上,也就是在View層展現咱們的數據。
以上代碼實現咱們對數據的編譯Compile以下圖,能夠看到咱們把獲取到el下面全部的子節點都存儲到了文檔碎片 fragment 中暫時存儲了起來(放到內存中),由於這裏要去頻繁的操做DOM和查找DOM,因此移到內存中操做。
效果圖:
如何實現經過修改數據引起視圖的變化呢?涉及到js中的經常使用的js設計模式--發佈訂閱模式。
發佈訂閱模式的實現
這裏用Dep方法來實現訂閱和通知,在這個類中有addSub(添加)和notify(通知)兩個方法,咱們把將要作的事情(函數)經過addSub添加進數組裏,等時機一到就notify通知裏面全部的方法執行。
經過watcher建立的函數都會有一個update執行的方法能夠方便咱們調用。
把定義函數的方法watcher加到了replace方法裏面,可是這裏的watcher跟剛寫編寫的多了兩個形參vm、RegExp.$1,並且寫法也新增了一些內容,由於當new Watcher的時候會引起發生幾個操做,來看完整代碼:
1)首先看在Watcher構造函數中新增了一些私有屬性分別表明:
效果圖:
函數調用關係