jQuery.data和jQuery._data(下划线数据)有什么区别?

时间:2011-10-17 00:35:14

标签: javascript jquery

在浏览源代码时,我注意到'toggle'应该使用jQuery._data来存储元素的状态。我检查了chrome中的jQuery.cache对象,发现元素的数据对象下面还有另一个对象,它由jQuery一词前面加上一个我猜是唯一标识它的数字。但是,我没有看到关于元素状态的数据。只需{olddisplay: 'block'}。关于jQuery._data的目的以及它本身如何工作的任何线索?

我一整天都在盯着源头......请不要告诉我查看来源。我的眼睛和大脑会感谢你。

1 个答案:

答案 0 :(得分:47)

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 ];
}