亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue數據驅動模擬實現4

2019-11-19 17:58:58
字體:
來源:轉載
供稿:網友

一、前言

在"模擬Vue之數據驅動3"中,我們實現了為每個對象擴展一個$set方法,用于新增屬性使用,這樣就可以監聽新增的屬性了。

當然,數組也是對象,也可以通過$set方法實現新增屬性。

但是,對于數組而言,通常我們是通過push之類的方法吧。

PS:Vue中明確指出push、pop、shift、unshift、splice、sort、reverse方法為變異方法,可以通過它們監聽屬性變化,觸發視圖更新(詳情見here

下面,我們就一起來實現這些Array的變異方法吧。

注:我們將Array變異方法實現,也寫在extendObj.js中的,因為數組也是對象嘛。

二、Array變異方法實現

要實現這些變異方法,毫無疑問,我們會重寫它們,那在Array.prototype里面重寫嗎?

當然不是,這樣不就影響了所有數組對象的原型鏈了么!

為了避免這種情況,且,我們只是想在監聽數據對象上繼承這些變異數組方法,那么細心的你會發現,其實與我們在"模擬Vue之數據驅動3"中實現$set方法類似了。

首先,我們創建arrKeys對象用于保存需要變異的數組方法以及恒定對象extendArr,如下:

let arrKeys = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];const extendArr = [];

接著,就是在extendArr對象上,一一監聽arrKeys中的方法了,與$set方法類似,整體結構如下:

!function(){  arrKeys.forEach(function(key){    proxyObject(extendArr, key, function(){      //TODO    });  });}();

注:proxyObject方法其實核心就是Object.defineProperty,詳見"模擬Vue之數據驅動3".

接下來,就是實現核心部分代碼了,重寫這些方法的目的,是為了監聽數據變化,所以要在方法原有功能不變的情況下,重寫它們,Array.xxx.apply即可實現原有功能。

且,push、unshift、splice這三個方法可以在原數組中,新增屬性,故而,我們需要監聽新增屬性以及它們的屬性值,這里就和$set方法完全一樣了,通過$Observer,即可利用observe以及convert方法實現了。

實現代碼如下:

!function(){  arrKeys.forEach(function(key){    proxyObject(extendArr, key, function(){      console.log('Fun ' + key + ' is observed');      let result;      let arrProto = Array.prototype;      let ob = this.$Observer;      let arr = arrProto.slice.call(arguments);      let inserted;      let index;      switch(key){        case 'push': {          inserted = arr;          index = this.length;          break;        }        case 'unshift': {          inserted = arr;          index = 0;          break;        }        case 'splice': {          inserted = arr.slice(2);          index = arr[0];          break;        }      }      result = arrProto[key].apply(this, arguments);      if(inserted){        inserted.forEach(val => {          ob.observe(val);          ob.convert(index++, val);        });      }      return result;    });  });}();

最后,就是在需要監聽的對象上繼承這些變異方法咯,如下:

//observer.jsfunction Observer(data){  if(!(this instanceof Observer)){    return new Observer(data);  }  data.__proto__ = extendObj;  //繼承變異方法push、pop等等  if(Array.isArray(data)){    data.__proto__.__proto__ = extendArr;  }  this.data = data;  this.walk(data);  }

好了,一切完畢,接下來就測試下唄:

<script src="./extendObj.js"></script><script src="./observer.js"></script><script>  'use strict';  let data = {    msg: [5, 2, 0],    user: {      name: 'Monkey',      age: 24    },    lover: {      name: 'Dorie',      age: 23    }  };  Observer(data);</script>

效果如下:

Perfect,此時,你可能會想,數組方法中僅有push、unshift、splice會為數組新增屬性,那么我們又何必將其他方法,例如sort、reverse重寫呢,也沒發現有什么貓膩呢?

不錯,在此時,并沒有什么卵用,但是,你要知道sort、reverse等這些方法,可是會引起數組變化的,那么就會影響視圖展現,這些變化,又怎么通知數組呢?就是下篇隨筆會具體說明的。

該篇隨筆代碼,詳情見github.

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97久久精品视频| 精品久久久久久久久久久久久久| 欧美在线观看www| 精品国产网站地址| 日韩一级黄色av| 精品高清一区二区三区| 久久男人资源视频| 欧美放荡办公室videos4k| 国产丝袜一区二区三区| 日韩成人中文字幕在线观看| 欧美午夜激情在线| 国产精品第一第二| 精品久久香蕉国产线看观看gif| 欧美第一黄色网| www.久久色.com| 97精品一区二区视频在线观看| 性金发美女69hd大尺寸| 日韩在线免费av| 久久影院资源网| 中文字幕国产亚洲2019| 国产成人精品a视频一区www| 欧美日韩亚洲精品内裤| 久久久99久久精品女同性| 91美女片黄在线观| 亚洲第一级黄色片| 国产成人一区二区三区电影| 欧美日韩免费看| 亚洲女人天堂av| 国产精品美女久久久久av超清| 久久久久久久久久久成人| 欧美大片大片在线播放| 亚洲精品自拍视频| 一区二区三区国产视频| 久久6精品影院| 亚洲精品永久免费精品| 亚洲**2019国产| 视频一区视频二区国产精品| 中文字幕久久久av一区| 国产日韩欧美在线观看| 亚州国产精品久久久| 久久天天躁夜夜躁狠狠躁2022| 国产精品69久久| 成人在线激情视频| 视频在线一区二区| 久久久成人av| 亚洲一区二区中文| 国产亚洲一区二区精品| 91地址最新发布| 国产一区二区在线播放| 永久免费看mv网站入口亚洲| 欧美午夜影院在线视频| 欧美亚洲免费电影| 欧美最近摘花xxxx摘花| 久久人91精品久久久久久不卡| 亚洲美女中文字幕| 日本精品久久久久影院| 91久久精品久久国产性色也91| 国产一区二区三区在线观看网站| 久久久久久国产精品三级玉女聊斋| 这里精品视频免费| 成人性生交xxxxx网站| 国产欧美精品在线播放| 日韩中文字幕在线视频播放| 不卡中文字幕av| 国产免费亚洲高清| 91免费国产网站| 亚洲免费精彩视频| 欧美俄罗斯性视频| 国产精品美乳在线观看| 97碰碰碰免费色视频| 国产精品日韩精品| 久久精品美女视频网站| 欧美午夜精品久久久久久人妖| 国产综合色香蕉精品| 9.1国产丝袜在线观看| 成人免费直播live| 亚洲tv在线观看| 久久精品国产电影| 久久影视免费观看| 国产精品第8页| 黑人巨大精品欧美一区二区| 久久九九精品99国产精品| 97视频在线免费观看| 亚洲精品xxxx| 久久av在线播放| 超碰精品一区二区三区乱码| 中文字幕欧美视频在线| 欧美日韩国产色| 亚洲人成网站777色婷婷| 国产日韩专区在线| 国产精自产拍久久久久久蜜| 久久久噜噜噜久噜久久| 亚洲精品天天看| 欧美国产亚洲视频| 亚洲石原莉奈一区二区在线观看| www.xxxx欧美| 91精品国产高清自在线看超| 国内精品久久久| 97香蕉超级碰碰久久免费的优势| 日韩免费观看高清| 国产最新精品视频| 国产精品中文久久久久久久| 欧美激情a在线| 海角国产乱辈乱精品视频| 91久久国产精品| 欧美激情在线播放| 亚洲影院高清在线| 538国产精品一区二区免费视频| 欧美与黑人午夜性猛交久久久| 国产91在线播放九色快色| 日韩美女中文字幕| 国产综合久久久久| 91久久精品国产91性色| 精品国内自产拍在线观看| 亚洲精品在线观看www| 久久精品视频在线| 日韩在线视频网站| 久久综合久久八八| 91久久综合亚洲鲁鲁五月天| 欧美综合在线观看| 久久免费精品视频| 日韩av电影手机在线观看| 精品国产视频在线| 亚洲色图国产精品| 日韩免费不卡av| 国产一区二区色| 97在线视频精品| 欧美日产国产成人免费图片| 国产精品久久久久国产a级| 国产在线视频91| 亚洲精品福利资源站| 在线播放精品一区二区三区| 中文字幕欧美国内| 色老头一区二区三区在线观看| 中文字幕亚洲国产| 亚洲一区二区三区成人在线视频精品| 色偷偷9999www| 在线不卡国产精品| 国产视频精品xxxx| 国产91色在线|免| 精品亚洲aⅴ在线观看| 草民午夜欧美限制a级福利片| 亚洲a级在线观看| 国产区精品视频| 国产一区二区三区视频| 国产999视频| 久久精品视频播放| 欧美成人一区二区三区电影| 69久久夜色精品国产69乱青草| 亚洲男女性事视频| 奇米一区二区三区四区久久| 国产精品普通话| 亚洲精品456在线播放狼人| 国产日产欧美精品| 51久久精品夜色国产麻豆| 久久久久久这里只有精品| 成人国产精品久久久| 亚洲精品在线91| 在线午夜精品自拍| 91精品国产精品| 国产精品高潮粉嫩av| 欧美中文在线视频| 97碰在线观看| 91亚洲国产成人精品性色|