vue的雙向綁定是基于數據劫持的方式實現的,vue2數據劫持用的object.defineProperty()來劫持對象的屬性,vue3是直接劫持對象,set數據變化的時候,發布消息給訂閱者,觸發相應的監聽回調。

**執行過程:**
當執行 new Vue() 時,Vue 就進入了初始化階段,一方面Vue 會遍歷 data 選項中的屬性,并用 Object.defineProperty 將它們轉為 getter/setter,實現數據變化監聽功能;另一方面,Vue 的指令編譯器Compile 對元素節點的指令進行掃描和解析,初始化視圖,并訂閱 Watcher 來更新視圖, 此時Wather 會將自己添加到消息訂閱器中(Dep),初始化完畢。
當數據發生變化時,Observer 中的 getter 方法被觸發(注意這里觸發什么),getter 會立即調用Dep.notify(),Dep 開始遍歷所有的訂閱者,并調用訂閱者的 update 方法,訂閱者收到通知后對視圖進行相應的更新。同理當表單輸入內容發生變化時, 就會觸發setter,watcher監聽機制就會執行, watcher通知Vue生成新的VDOM樹,再通過render函數進行渲染,生成真實DOM 。
**Object.defineProperty 的缺點**:
總體上說致命的缺點是:
* 不能監聽數組的變化
* 必須遍歷對象的每個屬性
* 必須深層遍歷嵌套的對象
**ES6中的Proxy的優點**:
總的來說呢,Proxy是剛好解決了上述**Object.defineProperty**的缺點:
**針對對象:**針對整個對象,而不是對象的某個屬性,所以也就不需要對 keys 進行遍歷。
**支持數組:**Proxy 不需要對數組的方法進行重載,省去了眾多 hack,減少代碼量等于減少了維護成本,而且標準的就是最好的。
當然除此之外還有以下幾個原因:
Proxy 的第二個參數可以有 13 種攔截方法,這比起 Object.defineProperty() 要更加豐富
Proxy 作為新標準受到瀏覽器廠商的重點關注和性能優化,相比之下 Object.defineProperty() 是一個已有的老方法。
- 一線大廠前端筆試真題解析
- 前
- 1、阿里(29問)
- 2、網易(26問)
- 3、滴滴(28問)
- 4、今日頭條17問
- vue常問
- webpack常問
- 其他常問
- vue雙向綁定、響應式原理
- js事件循環
- 頁面性能優化,打包優化
- vue的diff算法
- url輸入流程
- 深拷貝
- new、原型、繼承方式、symbol、閉包內存泄漏處理、判斷對象原型歸屬
- 觀察者和訂閱發布區別
- 封裝過哪些hooks
- ele組件二次封裝啥的
- 算法常問
- 幾種排序
- 二分查找
- 反轉二叉樹、先中后序遍歷、深度/廣度遍歷
- 數組去重
- 統計一個字符串出現最多的字母
- 斐波那契數列
- 速度創建1-100的數組
- 反轉單向鏈表
- 無重復字符的最長子串
- 一份面試題
- css常問
- 畫三角形
- flex
- 實現sticky footer (粘性頁腳)