使用data()設(shè)計(jì)避免數(shù)據(jù)共享問(wèn)題

vue中data為啥要用函數(shù)

理解為啥使用函數(shù)不直接使用對(duì)象的方式善榛,簡(jiǎn)單一句話戴而。直接對(duì)象會(huì)造成同一對(duì)象共享問(wèn)題。

為什么會(huì)造成共享問(wèn)題挽霉?

細(xì)探源碼防嗡,下面從組件的三個(gè)過(guò)程看看整個(gè)過(guò)程。
組件的三個(gè)過(guò)程

  1. 創(chuàng)建
  2. 注冊(cè)
  3. 實(shí)例化
    下面這篇文章對(duì)VUE源碼有比較清晰的認(rèn)識(shí)https://blog.csdn.net/yolo0927/article/details/78242989
組件是如何使用的侠坎?
// 方式一
var MyComponent = Vue.extend({
    name: 'my-component',
    template: '<div>{{name}}</div>'蚁趁,
    data(){
        return{
            name:""
        }
    }
});
Vue.component('my-component', MyComponent);
 
// 方式二
Vue.component('my-component', {
    name: 'my-component',
    template: '<div>{{name}}</div>',
    data(){
        return{
            name:""
        }
    }
});

// 使用組件
<div id="example">
    <my-component></my-component>
</div>
  • 方式一是怎么處理data的硅蹦?

源碼位于global-api/extend.js

extend.png

這里傳入的參數(shù)extendOptions和Super.options都一并合并放入的Sub.options,并通過(guò)this._init將原型上的options也并入Sub.options.extend最后返回的是這個(gè)構(gòu)造函數(shù)Sub荣德;

  • 方式二怎么處理data的?

具體如何定位到component源碼的可以參考這篇文章的分析
https://segmentfault.com/a/1190000012004707

component.png

從上面可以看出童芹,component做的處理就是注冊(cè)這個(gè)創(chuàng)建的組件涮瞻,如果傳入的第二個(gè)參數(shù)是一個(gè)對(duì)象,則會(huì)進(jìn)行一次創(chuàng)建操作假褪,其實(shí)也就是內(nèi)部也會(huì)執(zhí)行一下extend操作署咽,然后在注冊(cè)。這里沒(méi)有涉及到data的操作,也沒(méi)有實(shí)例化這個(gè)組件宁否。這里的這個(gè)definition對(duì)象是一個(gè)Sub構(gòu)造函數(shù)窒升。

  • 使用時(shí)怎么處理data的?

使用是組件實(shí)例化并完成了掛載過(guò)程慕匠。組件實(shí)例化也就是new一個(gè)構(gòu)造函數(shù)實(shí)例化饱须,掛載也就是將組件指定到HTML元素中輸出。new Sub則會(huì)實(shí)例化創(chuàng)建的這個(gè)組件台谊。

  • 那么new過(guò)程data是怎么樣的呢蓉媳?

new內(nèi)部會(huì)創(chuàng)建一個(gè)新的空對(duì)象,然后將這個(gè)對(duì)象的原型指向這個(gè)構(gòu)造函數(shù)的原型锅铅,并復(fù)制構(gòu)造函數(shù)的屬性酪呻,然后返回這個(gè)新的對(duì)象。如下:

function myNew(constructor){
    return function(){
        let obj={};
        obj.__proto__=constructor.prototype;
        constructor.apply(obj, arguments);
        return obj;
    }
}

所以Sub.options是構(gòu)造函數(shù)的屬性盐须,最后會(huì)通過(guò)constructor.apply(obj, arguments);變成實(shí)例化對(duì)象的屬性玩荠。

一般的構(gòu)造函數(shù)實(shí)例化,屬性被共享的情況
function initData(data){
    return typeof data==='function'?data():data;
}
function Sub(data){
    this.data=initData(data);
}
let data={
    name:'mzz'
}
let dataFn=function(){
    return{
        name:'mzz'
    }
}
let obj1=new Sub(data),
    obj2=new Sub(data);
console.log(obj1.data===obj2.data);   //true
let obj3=new Sub(dataFn),
    obj4=new Sub(dataFn);
console.log(obj3.data===obj4.data);  //false

上面這個(gè)一般化類(lèi)實(shí)例對(duì)象結(jié)果對(duì)象屬性被所有實(shí)例對(duì)象共享贼邓,VUE采取data()而不是直接對(duì)象也是這個(gè)道理阶冈。

總結(jié)

js中對(duì)象的引用造成數(shù)據(jù)被共享問(wèn)題比較常見(jiàn),可以學(xué)習(xí)這里傳函數(shù)形式避免構(gòu)造函數(shù)的對(duì)象屬性被實(shí)力對(duì)象共享立帖。大家都知道的原型繼承原型會(huì)被所有實(shí)例對(duì)象共享眼溶,無(wú)論在原型上的屬性是對(duì)象還是一般數(shù)據(jù)類(lèi)型,通過(guò)這里的學(xué)習(xí)晓勇,也可以看到實(shí)例對(duì)象還會(huì)共享構(gòu)造函數(shù)的對(duì)象類(lèi)型屬性堂飞。


以上僅作為個(gè)人學(xué)習(xí)參考,如有錯(cuò)誤望批評(píng)指正绑咱;

如果有小伙伴再繼續(xù)深入绰筛,有新見(jiàn)解的,望賜教描融。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铝噩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子窿克,更是在濱河造成了極大的恐慌骏庸,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件年叮,死亡現(xiàn)場(chǎng)離奇詭異具被,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)只损,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)一姿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)七咧,“玉大人,你說(shuō)我怎么就攤上這事叮叹“埃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蛉顽,是天一觀的道長(zhǎng)蝗砾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)携冤,這世上最難降的妖魔是什么遥诉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮噪叙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霉翔。我一直安慰自己睁蕾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布债朵。 她就那樣靜靜地躺著子眶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪序芦。 梳的紋絲不亂的頭發(fā)上臭杰,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音谚中,去河邊找鬼渴杆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宪塔,可吹牛的內(nèi)容都是我干的磁奖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼某筐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼比搭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起南誊,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤身诺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后抄囚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體霉赡,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年怠苔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了同廉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖迫肖,靈堂內(nèi)的尸體忽然破棺而出锅劝,到底是詐尸還是另有隱情,我是刑警寧澤蟆湖,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布故爵,位于F島的核電站,受9級(jí)特大地震影響隅津,放射性物質(zhì)發(fā)生泄漏诬垂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一伦仍、第九天 我趴在偏房一處隱蔽的房頂上張望结窘。 院中可真熱鬧,春花似錦充蓝、人聲如沸隧枫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)官脓。三九已至,卻和暖如春涝焙,著一層夾襖步出監(jiān)牢的瞬間卑笨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工仑撞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赤兴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓隧哮,卻偏偏與公主長(zhǎng)得像搀缠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子近迁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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