jQuery缓存机制(一)
1、首先看一下涉及到jQuery缓存机制的代码结构:
// 定义一些jQuery内部的变量,方便后续使用
var data_user, data_priv, // 后续会被赋值为两个Data对象
rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, // 匹配花括号和方括号及其中间的内容
rmultiDash = /([A-Z])/g;//匹配大写字母
// 定义Data的构造函数
function Data() {}
// 为Data构造函数添加一个uid属性
Data.uid = 1;
// 哪些类型的对象可以使用Data存储数据的:元素节点、文档节点、Object
Data.accepts = function( owner ) {};
// 为Data构造函数绑定方法
Data.prototype = {
key: function( owner ) {}, // 生成一个key唯一的key,这个key是通过jQuery的唯一id加上一个随机数产生的
set: function( owner, data, value ) {}, // 向cache中写数据
get: function( owner, key ) {}, // 从cache中拿数据
access: function( owner, key, value ) {}, // 一个set和get的总入口?处理一些特殊情况?暂时不太了解
remove: function( owner, key ) {}, // 从cache中删除数据
hasData: function( owner ) {}, // 检查owner(DOM||object)上是否有数据
discard: function( owner ) {} // 清除owner上的所有数据
};
// 内部实例化的两个Data对象。分工不同
// 使用第一个Data对象存取数据
data_user = new Data();
// 当所要存储数据的对象是DOM对象时,用来存储该对象是否设置了hasDataAttrs,仅限内部使用
data_priv = new Data();
// 为用户提供的使用$.的方式调用的接口
jQuery.extend({
acceptData: Data.accepts, // 标记哪些元素或者对象可以使用该Data存取数据
hasData: function( elem ) {}, // 是否有数据
data: function( elem, name, data ) {}, // 存取数据
removeData: function( elem, name ) {}, // 删除数据
_data: function( elem, name, data ) {}, // 存取数据(内部使用)
_removeData: function( elem, name ) {}, // 删除数据(内部使用)
});
// jQuery提供给用户的使用$(Obj).的方式使用的接口
jQuery.fn.extend({
data: function( key, value ) {}, // 存取数据
removeData: function( key ) {} // 删除数据
});
// 一个jQuery的私有方法,不绑定到任何的对象里,因为很多地方用到吗?奇怪,为什么要用这种方式写到这里?
function dataAttr( elem, key, data ) {}
2、核心问题:
a)两个实例化的Data对象分别有什么作用
b)Data对象内部的cache中是以怎样的形式存取数据的
c)元素、data对象、key、cache是怎么联系起来的