在vue中,一個常見的屬性是computed。它是一個計算屬性,只有在依賴的數據發生改變時才會重新計算,而不是每次渲染都重新計算。那么computed屬性的底層是如何實現的呢?
computed屬性的本質是一個函數,它接收一個對象作為參數。這個參數對象包含了依賴的數據,每當這些數據發生變化時,computed函數都會重新計算。
const dep = { a: 1, b: 2, }; const computedFn = function () { console.log(dep.a + dep.b); }; const reactiveDep = new Proxy(dep, { get(target, key, receiver) { /*...*/ }, set(target, key, value, receiver) { /*...*/ }, }); // 在computed函數中訪問依賴的數據 computedFn.call(reactiveDep); // 3
在computed函數中,我們使用了Proxy對象監聽了dep對象的訪問和修改。每當訪問或修改dep對象時,Proxy對象就會攔截這些操作并通知computed函數。
由于Proxy對象是ES6提供的新特性,因此在一些不支持ES6的環境中,如IE瀏覽器,computed屬性將無法工作。但是vue團隊考慮到這點,在vue2.x版本中,對computed屬性做了兼容處理,使其能夠在不支持ES6的環境中正常工作。