Vue2.X通過Object.defineProperty()來劫持各個屬性的setter,getter,新版本通過Proxy劫持屬性
Proxy優勢
支持數組,其實還不止
Object.defineProperty() 的問題主要有三個:
- 不能監聽數組的變化
- 必須遍歷對象的每個屬性
- 必須深層遍歷嵌套的對象
-
1、數據規模是否龐大。創建Vue實例的時候,一旦對象是一個深層的引用(老千層餅了),遞歸進行Observer的創建顯然會花很多時間;
2、對所有屬性的變化進行監聽,也需要消耗不小的內存;
3、新增/刪除屬性的時候,怎么調用/卸載defineProperty;
4、vue2的官方文檔,對開發者說明了defineProperty的一些限制,比如說數組在兩種情況下是無法監聽的:
1、利用索引直接設置一個數組項時,例如:arr[indexOfItem] = newValue;
2、修改數組的長度時,例如:arr.length = newLength;
Proxy 在 ES2015 規范中被正式加入,它有以下幾個優勢點
-
針對對象:針對整個對象,而不是對象的某個屬性,所以也就不需要對 keys 進行遍歷。這解決了上述 Object.defineProperty() 第二個問題
-
支持數組:Proxy 不需要對數組的方法進行重載,省去了眾多 hack,減少代碼量等於減少了維護成本,而且標准的就是最好的。
-
Proxy 的第二個參數可以有 13 種攔截方法,這比起 Object.defineProperty() 要更加豐富
-
Proxy 作為新標准受到瀏覽器廠商的重點關注和性能優化,相比之下 Object.defineProperty() 是一個已有的老方法,可以享受新版本紅利。