2011-10-17 52 views
24

雖然通過源代碼,我注意到'切換'據說使用jQuery._data來存儲元素的狀態。我查看了chrome中的jQuery.cache對象,發現該元素的數據對象下面還有另一個對象,它下面有一個jQuery單詞前面加上了一個我猜測唯一標識它的數字。但是,我沒有看到有關元素狀態的數據。只需{olddisplay: 'block'}。任何關於jQuery._data的目的和它本身如何工作的線索?jQuery.data和jQuery._data(下劃線數據)有什麼區別?

我一直在盯着源頭......請不要告訴我查看源代碼。我的眼睛和大腦會感謝你。

+2

你經常會請參閱旨在作爲* private *或其他特殊含義處理的變量和函數(或對象方法/屬性),它們具有像'_'這樣的預編輯字符,以便按範圍或應用程序將它們組合在一起。在jQuery中,它僅僅意味着*把它當作對象的私有*,即,**不要外部訪問。** –

回答

46

jQuery使用_data來設置它存儲在對象上的數據的'pvt'標誌。使用pvt,以便當您從對象請求公共數據時,不返回pvt數據。這是爲了讓jQuery內部使用.data()機制(如切換所做的那樣)來影響.data()的公共使用。

你可以在jQuery的源頭看這個聲明:

// For internal use only. 
_data: function(elem, name, data) { 
    return jQuery.data(elem, name, data, true); 
}, 

這只是調用jQuery.data,迫使第四個參數(這是隱私)是真實的。當檢索數據時,如果設置了pvt標誌,則以稍微不同的方式檢索它。公共接口.data()不公開pvt標誌。

你可以看到pvt一個例子處理這裏的jQuery.data()這一部分:

// An object can be passed to jQuery.data instead of a key/value pair; this gets 
// shallow copied over onto the existing cache 
if (typeof name === "object" || typeof name === "function") { 
    if (pvt) { 
     cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); 
    } else { 
     cache[ id ] = jQuery.extend(cache[ id ], name); 
    } 
} 

,再後來在相同的功能,這種評論是很好地說明了:

// Internal jQuery data is stored in a separate object inside the object's data 
// cache in order to avoid key collisions between internal data and user-defined 
// data 
if (pvt) { 
    if (!thisCache[ internalKey ]) { 
     thisCache[ internalKey ] = {}; 
    } 
    thisCache = thisCache[ internalKey ]; 
} 
+0

很好的描述。非常感謝你的回答! – THEtheChad

相關問題