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

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 15:33:47
字體:
來源:轉載
供稿:網友

本文介紹了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被訪問 

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 台东市| 淮南市| 遵化市| 霸州市| 沅江市| 九龙县| 龙陵县| 临邑县| 大洼县| 庆云县| 丽江市| 萨嘎县| 安西县| 府谷县| 喀什市| 萨迦县| 鄄城县| 南陵县| 福安市| 天津市| 灵武市| 宜州市| 稷山县| 绥江县| 萨嘎县| 工布江达县| 霍州市| 克拉玛依市| 阳春市| 定西市| 阿坝县| 油尖旺区| 达尔| 弥渡县| 宜宾县| 芦溪县| 剑河县| 陈巴尔虎旗| 潼南县| 屏南县| 邵武市|