在Vue2.x中,雙向數(shù)據(jù)綁定是通過(guò) 數(shù)據(jù)劫持 結(jié)合 發(fā)布訂閱模式的方式來(lái)實(shí)現(xiàn)的,也就是說(shuō)數(shù)據(jù)和視圖同步,數(shù)據(jù)發(fā)生變化,視圖跟著變化,視圖變化,數(shù)據(jù)也隨之發(fā)生改變。核心:關(guān)于VUE雙向數(shù)據(jù)綁定,其核心是 Object.defineProperty()方法。
Vue3.x則是用ES6的語(yǔ)法Proxy對(duì)象來(lái)實(shí)現(xiàn)的。
Object.defineProperty()的缺點(diǎn):
1. 只能監(jiān)聽(tīng)對(duì)象(Object),不能監(jiān)聽(tīng)數(shù)組的變化,無(wú)法觸發(fā)push, pop, shift, unshift,splice, sort, reverse。
2. 必須遍歷對(duì)象的每個(gè)屬性
3. 只能劫持當(dāng)前對(duì)象屬性,如果想深度劫持,必須深層遍歷嵌套的對(duì)象。
Proxy的優(yōu)點(diǎn):
4. Proxy 可以直接監(jiān)聽(tīng)對(duì)象而非屬性。
5. Proxy 可以直接監(jiān)聽(tīng)數(shù)組的變化。
6. Proxy 有多達(dá) 13 種攔截方法,不限于 apply、ownKeys、deleteProperty、has 等等是 Object.defineProperty 不具備的。
7. Proxy 返回的是一個(gè)新對(duì)象,我們可以只操作新的對(duì)象達(dá)到目的,而 Object.defineProperty 只能遍歷對(duì)象屬性直接修改。
8. Proxy 作為新標(biāo)準(zhǔn)將受到瀏覽器廠商重點(diǎn)持續(xù)的性能優(yōu)化,也就是傳說(shuō)中的新標(biāo)準(zhǔn)的性能紅利。
let arr = [];
let proxy = new Proxy(arr, {
get: function(obj, prop){
return obj[prop];
},
set: function(obj, prop, value){
obj[prop] = value; //可以被監(jiān)聽(tīng)到變化
return true;
}
});
setTimeout(()=>{
proxy.push(1);
}, 2000)