公司的新項(xiàng)目決定使用Vue.js來做,當(dāng)我打印出Vue實(shí)例下的data對象里的屬性時(shí),發(fā)現(xiàn)了一個(gè)有趣的事情:
它的每個(gè)屬性都有兩個(gè)相對應(yīng)的get和set方法,我覺的這是多此一舉的,于是去網(wǎng)上查了查Vue雙向綁定的實(shí)現(xiàn)原理,才發(fā)現(xiàn)它和Angular.js雙向綁定的實(shí)現(xiàn)原理完全不同,Angular是用的數(shù)據(jù)臟檢測,當(dāng)Model發(fā)生變化,會(huì)檢測所有視圖是否綁定了相關(guān)數(shù)據(jù),再更改視圖。而Vue使用的發(fā)布訂閱模式,是點(diǎn)對點(diǎn)的綁定數(shù)據(jù)。
Vue的數(shù)據(jù)綁定只有兩個(gè)步驟,compile=>link。
我一直在想,vue是通過什么去監(jiān)聽用戶對Model的修改,直到我發(fā)現(xiàn)Vue的data里,每個(gè)屬性都有set和get屬性,我才明白過來。
在平時(shí),我們創(chuàng)建一個(gè)對象,并修改它的屬性,是這樣的:
var obj = { val:99 } obj.val = 100; console.log(obj.val)//100
沒有任何問題,但是如果要你去監(jiān)測,當(dāng)我修改了這個(gè)對象的屬性時(shí),要去做一些事,你會(huì)怎么做?
這就要用到getter和setter了。
假設(shè)我現(xiàn)在要給一個(gè)碼農(nóng)對象添加一個(gè)name屬性,而且每次更新name屬性時(shí),我要去完成一些事,我們可以這樣做: