vue中的MVVM模式
即Model-View-ViewModel制妄。
Vue是以數(shù)據(jù)為驅(qū)動(dòng)的谓谦,Vue自身將DOM和數(shù)據(jù)進(jìn)行綁定吨凑,一旦創(chuàng)建綁定酝碳,DOM和數(shù)據(jù)將保持同步矾踱,每當(dāng)數(shù)據(jù)發(fā)生變化,DOM會(huì)跟著變化疏哗。
ViewModel是Vue的核心呛讲,它是Vue的一個(gè)實(shí)例。Vue實(shí)例時(shí)作用域某個(gè)HTML元素上的返奉,這個(gè)HTML元素可以是body贝搁,也可以是某個(gè)id所指代的元素。
DOM Listeners和Data Bindings是實(shí)現(xiàn)雙向綁定的關(guān)鍵芽偏,實(shí)現(xiàn)的原理是Object.defineProperty中的get和set方法雷逆,及消息訂閱模式。DOM Listeners監(jiān)聽(tīng)頁(yè)面所有View層DOM元素的變化哮针,當(dāng)發(fā)生變化关面,Model層的數(shù)據(jù)隨之變化坦袍;Data Bindings監(jiān)聽(tīng)Model層的數(shù)據(jù)十厢,當(dāng)數(shù)據(jù)發(fā)生變化,View層的DOM元素隨之變化捂齐。
Object.defineProperty詳解
Object.defineProperty(obj, prop, descriptor)
obj: 目標(biāo)對(duì)象 -必填
prop: 要定義的屬性或目標(biāo)方法 -必填
descriptor: 描述蛮放,是一個(gè)對(duì)象,以下詳解:
descriptor(value, writable, configurable, enumerable, get , set)
value: 屬性的值
writable: 屬性的值是否可以更改奠宜,默認(rèn)false
configurable: 總開(kāi)關(guān)包颁,設(shè)置為false后不能修改value、writable压真、configurable
enumerable:能否在for..in 或者Object.keys中循環(huán)出來(lái)娩嚼。
在descriptor中不能同時(shí)設(shè)置(value、writable) 和 (get滴肿、set)岳悟,否者會(huì)報(bào)錯(cuò),
就是說(shuō)想用(get 和 set)泼差,就不能用(wriable 或 value中的任何一個(gè))
下面舉例說(shuō)明一下
var book = {
_year: 2017,
edtion: 1
}
// get set
Object.defineProperty(book, 'year', {
get: function () {
return this._year; //必須返回
},
set: function (newValue) {
this._year = newValue;
this.edtion += 1;
// dosomething
}
});
// writable value
book.year = 2018;
console.log(book.edtion); //2
Object.defineProperty(book,'_year', {
writable: false,
value: 2018
})
book._year = 2019 //沒(méi)報(bào)錯(cuò)
console.log(book._year) // 2018,說(shuō)明值不會(huì)改變