大家有沒有想過,為什么vue可以監測到數據發生改變?其實底層借助了Object.defineProperty,底層有一個Observer的構造函數
讓我為大家簡單的介紹一下吧!
我用對象為大家演示一下
const vm = new Vue({el: "#app",data: {obj: {a: 1,b: 2}}})console.log(vm._data);
我們有沒有辦法,我們修改了數據,控制臺提示我們修改了這個數據
我們不借助vue來實現一下吧!
let data = {a: 1,b: 2}// 創建一個監測data的實例化對象let obs = new Observer(data)// 準備一個vm實例對象let vm = {}vm._data = data = obsfunction Observer(obj) {// 匯總成一個數組let keys = Object.keys(obj)keys.forEach(k => {// this 指向實例化對象上Object.defineProperty(this, k, {get() {return obj[k]},set(val) {obj[k] = valconsole.log(k + "被修改了");}})})}
這是不完善的,在vue的底層還有功能這里沒有實現,就比如vue可以直接vm.a = ?
,還有就是更深層次的監測,需要用到遞歸,日后為大家帶來更有意思的代碼
感謝大家的閱讀,如有不對的地方,可以向我提出,感謝大家!