jQuery получает или устанавливает данные тремя различными способами для трех различных типов объектов.
Для элемента DOM jQuery сначала получает уникальный идентификатор, а затем создает пользовательское свойство для элемента с именем expando * 1004.*:
var counter = 0;
function uid() {
// only example
return 'jQuery' + counter;
}
function getExpando(element) {
var expando = element['jQueryExpando'];
// for those without expando, create one
if (!expando) {
expando = element['jQueryExpando'] = uid();
}
return expando;
}
С другой стороны, jQuery имеет объект $ .cache, в котором хранится карта данных для каждого элемента, jQuery выполняет поиск в $ .cache с помощью expando и получает карту данных для определенного элемента, получая или устанавливаяданные в этой карте:
function data(element, name, value) {
var expando = getExpando(element);
var map = $.cache[expando];
// get data
if (value === undefined) {
return map && map[name];
}
// set data
else {
// for those without any data, create a pure map
if (!map) {
map = $.cache[expando] = {};
}
map[name] = value;
return value;
}
}
Для пользовательского объекта (который не является элементом DOM или объектом окна), jQuery напрямую устанавливает или получает свойство этого объекта по имени:
function data(obj, name, value) {
if (!obj) {
return obj;
}
// get data
if (value === undefined) {
return obj[name];
}
// set data
else {
obj[name] = value;
return value;
}
}
Наконец, для специального объекта окна в jQuery есть специальная переменная windowData в закрытии для хранения данных для окна:
function data(obj, name, value) {
if ($.isWindow(obj)) {
obj = windowData;
}
// same as data for custom object
}