前面的第三小節留下了一個疑問:jQuery.data() 與 .data()為什么會有區別?
jQuery的方法設計大都是多用的,可以根據傳遞參數的個數判斷是set還是get處理,不僅如此jQuery還對參數的傳遞類型還抽出了一個處理的方法jQuery.access,我們可以傳遞字符串、數組、對象等等,根據這種類型自動分解成接口所有能接受的參數。
省略了部分,比如數據的過濾,HMLT5 data的處理之類,保留直接的處理,如下代碼:
jQuery.fn.extend({
data: function(key, value) {
return access(this, function(value) {
// 通過access解析出參數 value的值
}, null, value, arguments.length > 1, null, true)
})
}
通過access解析后的參數就能讓data_user接口所接收,此時我們可以調用數據對象接口開始對數據進行存儲設置了。
this.each(function() {
var data = data_user.get( this, camelKey );
data_user.set( this, camelKey, value );
});
因為jQuery可以是一個元素合集,所以內部需要通過each對每一個合集都遍歷處理,
對數據的存儲內部就是調用的data_user.get緩存類的接口。
get: function(owner, key) {
var cache = this.cache[this.key(owner)];
return key === undefined ?
cache : cache[key];
}
通過get方法通過key去cache中取得之前的值,如果沒有則新開辟一個空間用來存儲之后的新值,
通過data_user.set去設置這個新的值:
set: function(owner, data, value) {
var prop,
unlock = this.key(owner),
cache = this.cache[unlock];
cache[data] = value;
return cache;
}
取出cache中對應的存儲空間,然后可見
cache[ data ] = value;
數據直接就是通過對象的鍵值對的方式存儲在內存中的。
當我們重復同一個key的時候,其實是反復操作同一個cache緩存區下的同一個key
所以當下面:
cache[‘bar’] = {
myType: "慕課網一",
});
cache[‘bar’] = {
myType: "慕課網二",
});
這種情況下,肯定是被覆蓋掉了。所以也就為什么通過實例的接口會覆蓋數據了。
請驗證,完成請求
由于請求次數過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報