vue源碼學(xué)習(xí)之Object.defineProperty對象屬性監(jiān)聽
本文介紹了vue源碼學(xué)習(xí)之Object.defineProperty對象屬性監(jiān)聽,分享給大家,具體如下:
參考版本 vue源碼版本:0.11
相關(guān)
vue實(shí)現(xiàn)雙向數(shù)據(jù)綁定的關(guān)鍵是 Object.defineProperty ,讓我們先來看下這個函數(shù)。
在MDN上查看有關(guān)Object.defineProperty 的解釋。
我們先從最簡單的開始:
let a = {'b': 1}; Object.defineProperty(a, 'b', { enumerable: false, configurable: false, get: function(){ console.log('b' + '被訪問'); }, set: function(newVal){ console.log('b' + '被修改,新' + 'b' + '=' + newVal); } }); a.b = 2; // b被修改,新b=2 a.b; // b被訪問
這樣,我們就能監(jiān)聽對象了!但問題并不僅僅這么簡單。。。
我們可能會有對象中屬性的值還是對象這種嵌套情況,可以通過遞歸解決!
在vue源代碼文件 srcobserveobserver.js 中
// 觀察者構(gòu)造函數(shù) function Observer(data){ this.data = data; this.walk(data); } let p = Observer.prototype; p.walk = function(obj){ let val; for(let key in obj){ // 通過 hasOwnProperty 過濾掉一個對象本身擁有的屬性 if(obj.hasOwnProperty(key)){ val = obj[key]; // 遞歸調(diào)用 循環(huán)所有對象出來 if(typeof val === 'object'){ new Observer(val); } this.convert(key, val); } } }; p.convert = function(key, val){ Object.defineProperty(this.data, key, { enumerable: false, configurable: false, get: function(){ console.log(key + '被訪問'); }, set: function(newVal){ console.log(key + '被修改,新' + key + '=' + newVal); if(newVal === val) return ; val = newVal; } }) }; let data = { user: { name: 'zhangsan', age: 14 }, address: { city: 'beijing' } } let app = new Observer(data); data.user.name; // user被訪問
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Vue Object.defineProperty及ProxyVue實(shí)現(xiàn)雙向數(shù)據(jù)綁定
- vue.js的雙向數(shù)據(jù)綁定Object.defineProperty方法的神奇之處
- vue用Object.defineProperty手寫一個簡單的雙向綁定的示例
- vue源碼學(xué)習(xí)之Object.defineProperty 對數(shù)組監(jiān)聽
- 淺談vue實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽的函數(shù) Object.defineProperty
- vue.js利用Object.defineProperty實(shí)現(xiàn)雙向綁定
- Vue中的Object.defineProperty全面理解
相關(guān)文章
解決vue-element-admin中配置跨域出現(xiàn)的問題
這篇文章主要介紹了解決vue-element-admin中配置跨域出現(xiàn)的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07vue3+vite實(shí)現(xiàn)在線預(yù)覽pdf功能
這篇文章主要為大家詳細(xì)介紹了如何通過vue3和vite實(shí)現(xiàn)在線預(yù)覽pdf功能,文中的示例代碼簡潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2023-10-10