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