Vue原理解析:Vue 實例如何實現(xiàn)代理 data 對象屬性的訪問

對于初學Vue.js的小伙伴而言,可能會認為Vue實例是一個很神奇的東西捧韵!因為它除了幫助我們完成雙向綁定之外丝蹭,還在某些細節(jié)方面為我們增加了一些理解上面的小煩惱!希望通過這篇文章能夠為勤勉的你解惑~

看一段簡單代碼先:

new Vue({
    el:"#myApp",
    data:{
        userName:"laoWangTou",
        age:16
    },
    methods:{
        run(){
            // 輸出結果:laoWangTou今年16歲了
            console.log(this.userName+"今年"+this.age+"歲了");
        }
    },
    created(){
        // this為什么可以調用methods的run方法犁享?
        this.run();
    }
})

對于以上代碼可能會有兩個小疑問:
1余素、為什么鉤子函數(shù)中的 this.run 可以調用到methods對像下的方法run?
2、為什么methods對象下的run方法可以通過this獲得data下的屬性炊昆?
要弄明白這兩個問題首先你要明白下面幾個點:

  • this即是通過Vue生成的實例vm
const vm = new Vue({
    el:"#myApp",
    created(){
        console.log(vm === this);// true
    }
})
  • $data與data是相等的
const data ={};
const vm = new Vue({
    el:"#myApp",
    data,
    created(){
        console.log(this.$data === data);// true
    }
})
console.log(vm.$data === data);// true
  • $data的屬性被修改桨吊,vm實例下的屬性也會發(fā)生相應的變化
const vm = new Vue({
    el:"#myApp",
    data:{
        userName:"laoWangTou",
        age:16
    },
    created(){
        this.$data.userName = "xiaoZhang"
        this.$data.age = 18;
        // 輸出結果:xiaoZhang今年18歲了
        console.log(this.userName+"今年"+this.age+"歲了");
    }
})
// 輸出結果:xiaoZhang今年18歲了
console.log(vm.userName+"今年"+vm.age+"歲了");

通過之前的兩個疑問及得到的個結論,咱們可以先來個小猜測:

1凤巨、通過Vue生成的實例中有一屬性為$data视乐,其值為接收對象的data值
2、vm實例中代理了data的屬性
3敢茁、methods下的方法賦值給了vm實例

于是佑淀,結合Vue.js的源碼模擬出了以下較易理解的代碼:

// 定義了一個構造函數(shù)
function Vue(options) {
    this.$data = options.data || {};
    this.initState(options);
}
Vue.prototype.initState = function (opts) {
    if(opts.data)
        this.initData(opts.data);
    if(opts.methods)
        this.initMethods(opts.methods);
    if(opts.created)
        opts.created.call(this);
}
Vue.prototype.initData = function (data) {
    var keys = Object.keys(data);
    var i = keys.length;
    while (i--){
        const key = keys[i];
        this.proxy("$data",key);
    }
}
Vue.prototype.initMethods = function (methods) {
    for (var key in methods) {
        this[key] = methods[key];
    }
}
Vue.prototype.proxy =function(sourceKey, key) {
    Object.defineProperty(this, key, {
        get() {
            return this[sourceKey][key]
        },
        set(val){
            this[sourceKey][key] = val;
        }
    });
};

驗證:

const vm = new Vue({
    el:"#myApp",
    data:{
        userName:"laoWangTou",
        age:16
    },
    methods:{
        run(){
            // 輸出結果:laoWangTou今年16歲了
            console.log(this.userName+"今年"+this.age+"歲了");
        }
    },
    created(){
        // this為什么可以調用methods的run方法?
        this.run();
    }
});
// 輸出結果:laoWangTou今年16歲了
console.log(vm.userName+"今年"+vm.age+"歲了");

—————END—————

喜歡本文的朋友們彰檬,歡迎關注公眾號 張培躍伸刃,收看更多精彩內容

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逢倍,隨后出現(xiàn)的幾起案子奕枝,更是在濱河造成了極大的恐慌,老刑警劉巖瓶堕,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隘道,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機谭梗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門忘晤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人激捏,你說我怎么就攤上這事设塔。” “怎么了远舅?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵闰蛔,是天一觀的道長。 經(jīng)常有香客問我图柏,道長序六,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任蚤吹,我火速辦了婚禮例诀,結果婚禮上,老公的妹妹穿的比我還像新娘裁着。我一直安慰自己繁涂,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布二驰。 她就那樣靜靜地躺著扔罪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桶雀。 梳的紋絲不亂的頭發(fā)上矿酵,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音背犯,去河邊找鬼坏瘩。 笑死,一個胖子當著我的面吹牛漠魏,可吹牛的內容都是我干的倔矾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼柱锹,長吁一口氣:“原來是場噩夢啊……” “哼哪自!你這毒婦竟也來了?” 一聲冷哼從身側響起禁熏,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤壤巷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瞧毙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胧华,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡寄症,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矩动。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片有巧。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悲没,靈堂內的尸體忽然破棺而出篮迎,到底是詐尸還是另有隱情,我是刑警寧澤示姿,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布甜橱,位于F島的核電站,受9級特大地震影響栈戳,放射性物質發(fā)生泄漏岂傲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一荧琼、第九天 我趴在偏房一處隱蔽的房頂上張望譬胎。 院中可真熱鬧差牛,春花似錦命锄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侦讨,卻和暖如春驶冒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背韵卤。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工骗污, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沈条。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓需忿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜡歹。 傳聞我的和親對象是個殘疾皇子屋厘,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內容

  • 清愁積院,秋聲碾碎西風眠月而。 一曲酥纏汗洒,兩顧不生別。 往復匆匆父款,又道無人憐溢谤。 窗續(xù)寒瞻凤,夢送微瀾,只怪相思劫世杀。
    第十六只孤鴻閱讀 496評論 5 9
  • 第一章 同居生活的開始 明天就是我最愛的人結婚的日子了鲫构。 我以為我不會很傷心的,可是真的到這么一天玫坛,我才發(fā)現(xiàn)我是真...
    白白學長閱讀 335評論 0 0
  • 柔光搖落新叢影结笨,竹擁修長潤雨增。 小道來風梳雜草湿镀,幽幽似待有詩朋炕吸。
    01公子閱讀 810評論 2 5
  • 讀書營開營上,貓叔說到書要讀十遍勉痴,我心里咯噔一下赫模,自己讀書都是拿起就讀,寫清單體時更是囫圇吞棗蒸矛,感覺這種狀態(tài)不好瀑罗,...
    許CC閱讀 321評論 1 3
  • 為了生活他不得不早起奔波,他已經(jīng)習慣天未亮就發(fā)動車子雏掠,多年的出租經(jīng)驗告訴他火車站附近每次都不會跑空斩祭。他不喜歡太晚,...
    王小二哥閱讀 175評論 0 0