我們看看Data類是如何構(gòu)建這個(gè)緩存池的:
(1)先在jQuery內(nèi)部創(chuàng)建一個(gè)cache對(duì)象{}, 來保存緩存數(shù)據(jù)。 然后往需要進(jìn)行緩存的DOM節(jié)點(diǎn)上擴(kuò)展一個(gè)值為expando的屬性
function Data() { Object.defineProperty(this.cache = {}, 0, { get: function() { return {}; } }); this.expando = jQuery.expando + Math.random(); }
注:expando的值,用于把當(dāng)前數(shù)據(jù)緩存的UUID值做一個(gè)節(jié)點(diǎn)的屬性給寫入到指定的元素上形成關(guān)聯(lián)橋梁,所以,所以元素本身具有這種屬性的可能性很少,所以可以忽略沖突。
(2)接著把每個(gè)節(jié)點(diǎn)的dom[expando]的值都設(shè)為一個(gè)自增的變量id,保持全局唯一性。 這個(gè)id的值就作為cache的key用來關(guān)聯(lián)DOM節(jié)點(diǎn)和數(shù)據(jù)。也就是說cache[id]就取到了這個(gè)節(jié)點(diǎn)上的所有緩存,即id就好比是打開一個(gè)房間(DOM節(jié)點(diǎn))的鑰匙。 而每個(gè)元素的所有緩存都被放到了一個(gè)map映射里面,這樣可以同時(shí)緩存多個(gè)數(shù)據(jù)。
Data.uid = 1;
關(guān)聯(lián)起dom對(duì)象與數(shù)據(jù)緩存對(duì)象的一個(gè)索引標(biāo)記,換句話說,先在dom元素上找到expando對(duì)應(yīng)值,也就uid,然后通過這個(gè)uid找到數(shù)據(jù)cache對(duì)象中的內(nèi)。
(3)所以cache對(duì)象結(jié)構(gòu)應(yīng)該像下面這樣:
var cache = { "uid1": { // DOM節(jié)點(diǎn)1緩存數(shù)據(jù), "name1": value1, "name2": value2 }, "uid2": { // DOM節(jié)點(diǎn)2緩存數(shù)據(jù), "name1": value1, "name2": value2 } // ...... };
每個(gè)uid對(duì)應(yīng)一個(gè)elem緩存數(shù)據(jù),每個(gè)緩存對(duì)象是可以由多個(gè)name value(名值對(duì))對(duì)組成的,而value是可以是任何數(shù)據(jù)類型的。
如圖如示:
流程分解:(復(fù)雜的過濾,找重的過程去掉)
第一步:jQuery本身就是包裝后的數(shù)組結(jié)構(gòu),這個(gè)不需要解析了
第二步:通過data存儲(chǔ)數(shù)據(jù)
為了不把數(shù)據(jù)與dom直接關(guān)聯(lián),所以會(huì)把數(shù)據(jù)存儲(chǔ)到一個(gè)cache對(duì)象上 產(chǎn)生一個(gè) unlock = Data.uid++; unlock 標(biāo)記號(hào) 把unlock標(biāo)記號(hào),作為一個(gè)屬性值 賦予$body節(jié)點(diǎn) cache緩存對(duì)象中開辟一個(gè)新的空間用于存儲(chǔ)foo數(shù)據(jù),this.cache[ unlock ] = {}; 最后把foo數(shù)據(jù)掛到cache上,cache[ data ] = value;
第三步:通過data獲取數(shù)據(jù)
從$body節(jié)點(diǎn)中獲取到unlock標(biāo)記 通過unlock在cache中取到對(duì)應(yīng)的數(shù)據(jù)
流程圖:
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報(bào)