Vue3 使用Proxy替代了defineProperty。
Proxy 相比於 defineProperty 的優勢
Object.defineProperty() 的問題主要有三個:
- 不能監聽數組的變化
- 必須遍歷對象的每個屬性
- 必須深層遍歷嵌套的對象
Proxy 在 ES2015 規范中被正式加入,它有以下幾個特點:
- 針對對象:針對整個對象,而不是對象的某個屬性,所以也就不需要對 keys 進行遍歷。這解決了上述 Object.defineProperty() 第二個問題
- 支持數組:Proxy 不需要對數組的方法進行重載,省去了眾多 hack,減少代碼量等於減少了維護成本,而且標准的就是最好的。
除了上述兩點之外,Proxy 還擁有以下優勢:
- Proxy 的第二個參數可以有 13 種攔截方法,這比起 Object.defineProperty() 要更加豐富
- Proxy 作為新標准受到瀏覽器廠商的重點關注和性能優化,相比之下 Object.defineProperty() 是一個已有的老方法。
缺陷:IE 不兼容