亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

章節
問答
課簽
筆記
評論
占位
占位

Data類的設計

我們看看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 可將課程添加到書簽

邀請您關注公眾號
關注后,及時獲悉本課程動態

舉報

0/150
提交
取消
全部 精華 我要發布
全部 我要發布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費2個積分

你的積分不足,無法發表

為什么扣積分?

本次提問將花費2個積分

繼續發表請點擊 "確定"

為什么扣積分?