1、首先看一下涉及到jQuery緩存機制的代碼結構:
// 定義一些jQuery內部的變量,方便后續使用
var data_user, data_priv, // 后續會被賦值為兩個Data對象
rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, // 匹配花括號和方括號及其中間的內容
rmultiDash = /([A-Z])/g;//匹配大寫字母
// 定義Data的構造函數
function Data() {}
// 為Data構造函數添加一個uid屬性
Data.uid = 1;
// 哪些類型的對象可以使用Data存儲數據的:元素節點、文檔節點、Object
Data.accepts = function( owner ) {};
// 為Data構造函數綁定方法
Data.prototype = {
key: function( owner ) {}, // 生成一個key唯一的key,這個key是通過jQuery的唯一id加上一個隨機數產生的
set: function( owner, data, value ) {}, // 向cache中寫數據
get: function( owner, key ) {}, // 從cache中拿數據
access: function( owner, key, value ) {}, // 一個set和get的總入口?處理一些特殊情況?暫時不太了解
remove: function( owner, key ) {}, // 從cache中刪除數據
hasData: function( owner ) {}, // 檢查owner(DOM||object)上是否有數據
discard: function( owner ) {} // 清除owner上的所有數據
};
// 內部實例化的兩個Data對象。分工不同
// 使用第一個Data對象存取數據
data_user = new Data();
// 當所要存儲數據的對象是DOM對象時,用來存儲該對象是否設置了hasDataAttrs,僅限內部使用
data_priv = new Data();
// 為用戶提供的使用$.的方式調用的接口
jQuery.extend({
acceptData: Data.accepts, // 標記哪些元素或者對象可以使用該Data存取數據
hasData: function( elem ) {}, // 是否有數據
data: function( elem, name, data ) {}, // 存取數據
removeData: function( elem, name ) {}, // 刪除數據
_data: function( elem, name, data ) {}, // 存取數據(內部使用)
_removeData: function( elem, name ) {}, // 刪除數據(內部使用)
});
// jQuery提供給用戶的使用$(Obj).的方式使用的接口
jQuery.fn.extend({
data: function( key, value ) {}, // 存取數據
removeData: function( key ) {} // 刪除數據
});
// 一個jQuery的私有方法,不綁定到任何的對象里,因為很多地方用到嗎?奇怪,為什么要用這種方式寫到這里?
function dataAttr( elem, key, data ) {}
2、核心問題:
a)兩個實例化的Data對象分別有什么作用
b)Data對象內部的cache中是以怎樣的形式存取數據的
c)元素、data對象、key、cache是怎么聯系起來的
