前面的第三小節留下了一個疑問: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 可將課程添加到書簽
舉報