国产探花免费观看_亚洲丰满少妇自慰呻吟_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被訪問 

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 周口市| 栖霞市| 桃江县| 佛冈县| 大庆市| 万盛区| 兴山县| 牙克石市| 望都县| 区。| 尖扎县| 萨嘎县| 南丰县| 济源市| 麻栗坡县| 福海县| 满洲里市| 贵德县| 威海市| 榆树市| 奇台县| 龙州县| 巨鹿县| 潢川县| 桦川县| 大厂| 平阳县| 盐亭县| 九寨沟县| 永宁县| 盈江县| 弥渡县| 通河县| 鄯善县| 文成县| 吉隆县| 阜阳市| 津市市| 石河子市| 无为县| 恩平市|