В чем разница между jQuery.данные и jQuery._data (подчеркивание данных)?

#javascript #jquery

#javascript #jquery

Вопрос:

Просматривая исходный код, я заметил, что ‘toggle’ предположительно используется jQuery._data для хранения состояния элемента. Я исследовал jQuery.cache объект в Chrome и обнаружил, что под объектом данных элемента находится еще один объект, перед которым стоит слово jQuery с номером, который, как я предполагаю, однозначно идентифицирует его. Однако я не видел данных о состоянии элемента. Просто {olddisplay: 'block'} . Есть какие-либо подсказки относительно назначения jQuery._data и того, как это работает само по себе?

Я весь день смотрел на исходный код …. пожалуйста, не говорите мне просматривать исходный код. Мои глаза и мозг будут вам благодарны.

Комментарии:

1. Часто вы увидите, что переменные и функции (или методы / свойства объекта), которые предназначены для обработки как частные , или какое-либо другое специальное значение, имеют предварительно определенный символ, например _ , чтобы сгруппировать их по области или приложению. В jQuery это означает просто рассматривать это как частное для объекта , т. Е. Не обращаться к нему извне.

Ответ №1:

jQuery использует _data для установки флага pvt для данных, которые он хранит на объекте. pvt используется для того, чтобы при запросе общедоступных данных из объекта данные pvt не возвращались. Это делается для того, чтобы внутреннее использование .data() механизма jQuery (например, то, что делает toggle) не влияло на публичное использование .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 ];
}
  

Комментарии:

1. Отличное описание. Большое вам спасибо за ваш ответ!