国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue源碼學習之Object.defineProperty對象屬性監聽

2019-11-19 13:45:22
字體:
來源:轉載
供稿:網友

本文介紹了vue源碼學習之Object.defineProperty對象屬性監聽,分享給大家,具體如下:

參考版本 vue源碼版本:0.11

相關

vue實現雙向數據綁定的關鍵是 Object.defineProperty ,讓我們先來看下這個函數。

在MDN上查看有關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=2a.b;    // b被訪問

這樣,我們就能監聽對象了!但問題并不僅僅這么簡單。。。

我們可能會有對象中屬性的值還是對象這種嵌套情況,可以通過遞歸解決!

在vue源代碼文件 srcobserveobserver.js 中

// 觀察者構造函數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];      // 遞歸調用 循環所有對象出來      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被訪問 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汝州市| 石景山区| 乌什县| 库尔勒市| 佳木斯市| 天峨县| 保山市| 永定县| 滦平县| 河东区| 利辛县| 精河县| 泰顺县| 涟源市| 陕西省| 北宁市| 邓州市| 上饶县| 全南县| 游戏| 天祝| 马山县| 陆良县| 大余县| 景洪市| 鄂托克前旗| 鹤壁市| 合山市| 拉萨市| 乐安县| 隆昌县| 勃利县| 穆棱市| 盱眙县| 咸宁市| 西峡县| 双辽市| 凭祥市| 南华县| 家居| 夏津县|