vue源碼探究(第三彈)

vue源碼探究(第三彈)

結(jié)束了之前prepare蛛勉,現(xiàn)在開始正式進入vue源碼探究部分

數(shù)據(jù)代理

先從簡單的入手剔桨,我們先手動實現(xiàn)一個簡易版的數(shù)據(jù)代理吧限匣。

基礎(chǔ)知識

  1. vue數(shù)據(jù)代理: data對象的所有屬性的操作(讀/寫)由vm對象來代理操作
  2. 好處: 通過vm對象就可以方便的操作data中的數(shù)據(jù)
  3. 實現(xiàn):
    1). 通過Object.defineProperty(vm, key, {})給vm添加與data對象的屬性對應(yīng)的屬性
    2). 所有添加的屬性都包含get/set方法
    3). 在get/set方法中去操作data中對應(yīng)的屬性

舉個例子??

<div id="test"></div>

<script type="text/javascript" src="js/mvvm/compile.js"></script>
<script type="text/javascript" src="js/mvvm/mvvm.js"></script>
<script type="text/javascript" src="js/mvvm/observer.js"></script>
<script type="text/javascript" src="js/mvvm/watcher.js"></script>
<script type="text/javascript">
  // 這里取名為mvvm 是因為在mvvm.js中 
  // 是這樣暴露的 function MVVM(options) {} 這里的MVVM和vue是一樣的 只是一個命名的問題
  const vm = new MVVM({
    el: "#test",
    data: {
      name: '張三2'
    }
  })
  console.log(vm.name)  // 讀取的是data中的name,  vm代理對data的讀操作
  vm.name = '李四2' // 數(shù)據(jù)保存到data中的name上, vm代理對data的寫操作
  console.log(vm.name, vm._data.name) // 李四2 李四2
</script>

上面這部分是為了簡單說明讥珍,我們寫的mvvm實現(xiàn)了簡單的數(shù)據(jù)代理历极,接下來,我們來剖析一下它的內(nèi)部實現(xiàn)衷佃。
先揭一個底趟卸,它的核心實現(xiàn)就是之前講過的Object.defineProperty

/*
相關(guān)于Vue的構(gòu)造函數(shù)
 */
function MVVM(options) {
  // 將選項對象保存到vm
  this.$options = options;
  // 將data對象保存到vm和datq變量中
  var data = this._data = this.$options.data;
  //將vm保存在me變量中
  var me = this;
  // 遍歷data中所有屬性
  Object.keys(data).forEach(function (key) { // 屬性名: name
    // 對指定屬性實現(xiàn)代理
    me._proxy(key);
  });

  // 對data進行監(jiān)視
  observe(data, this);

  // 創(chuàng)建一個用來編譯模板的compile對象
  this.$compile = new Compile(options.el || document.body, this)
}

MVVM.prototype = {
  $watch: function (key, cb, options) {
    new Watcher(this, key, cb);
  },

  // 對指定屬性實現(xiàn)代理
  _proxy: function (key) {
    // 保存vm
    var me = this;
    // 給vm添加指定屬性名的屬性(使用屬性描述)
    Object.defineProperty(me, key, {
      configurable: false, // 不能再重新定義
      enumerable: true, // 可以枚舉
      // 當(dāng)通過vm.name讀取屬性值時自動調(diào)用
      get: function proxyGetter() {
        // 讀取data中對應(yīng)屬性值返回(實現(xiàn)代理讀操作)
        return me._data[key];
      },
      // 當(dāng)通過vm.name = 'xxx'時自動調(diào)用
      set: function proxySetter(newVal) {
        // 將最新的值保存到data中對應(yīng)的屬性上(實現(xiàn)代理寫操作)
        me._data[key] = newVal;
      }
    });
  }
};

Tips:

在源碼學(xué)習(xí)的過程中,掌握到了一個小技巧氏义,讀源碼的時候锄列,debugger會更加的方便。

image.png
image.png

非常好用惯悠,我之前太蠢了邻邮,只會第一個resume script execution

最后

未完待續(xù)...
接下來,還有一個更有趣的東西

下一章繼續(xù)~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末克婶,一起剝皮案震驚了整個濱河市筒严,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌情萤,老刑警劉巖鸭蛙,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異筋岛,居然都是意外死亡娶视,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門泉蝌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歇万,“玉大人,你說我怎么就攤上這事勋陪√盎牵” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵诅愚,是天一觀的道長寒锚。 經(jīng)常有香客問我劫映,道長,這世上最難降的妖魔是什么刹前? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任泳赋,我火速辦了婚禮,結(jié)果婚禮上喇喉,老公的妹妹穿的比我還像新娘祖今。我一直安慰自己,他們只是感情好拣技,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布千诬。 她就那樣靜靜地躺著,像睡著了一般膏斤。 火紅的嫁衣襯著肌膚如雪徐绑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天莫辨,我揣著相機與錄音傲茄,去河邊找鬼。 笑死沮榜,一個胖子當(dāng)著我的面吹牛盘榨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敞映,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼较曼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了振愿?” 一聲冷哼從身側(cè)響起捷犹,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冕末,沒想到半個月后萍歉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡档桃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年枪孩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藻肄。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔑舞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘹屯,到底是詐尸還是另有隱情攻询,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布州弟,位于F島的核電站钧栖,受9級特大地震影響低零,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拯杠,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一掏婶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧潭陪,春花似錦雄妥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至誓沸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壹粟,已是汗流浹背拜隧。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趁仙,地道東北人洪添。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像雀费,于是被迫代替她去往敵國和親干奢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • vue理解淺談 一 理解vue的核心理念 使用vue會讓人感到身心愉悅,它同時具備angular和react的優(yōu)點...
    ambeer閱讀 24,118評論 2 18
  • 1.安裝 可以簡單地在頁面引入Vue.js作為獨立版本盏袄,Vue即被注冊為全局變量忿峻,可以在頁面使用了。 如果希望搭建...
    Awey閱讀 10,999評論 4 129
  • 「聲動派」辕羽,專注互聯(lián)網(wǎng)價值傳播逛尚,為你分享大連接時代的一切! 本文大約11000字閱讀需要12分鐘 第一部分 寫在前...
    聲動派閱讀 581評論 0 1
  • 物有本末刁愿,事有終始绰寞,知所先后,則近道矣 ---《大學(xué)》 在分析Vue初始化之前铣口,我們先看看Vue源碼的目錄結(jié)構(gòu):...
    海洋之木閱讀 8,064評論 13 46
  • 在互聯(lián)網(wǎng)時代下成長的95后脑题,對于信息的接受程度越來越“開明”件缸,從直播、二次元旭蠕、彈幕到表情包大戰(zhàn)停团,當(dāng)下的趨勢都在隨著...
    Doku閱讀 277評論 0 0