简介:
$().data,用于在jQuery实例对象中存储对象数据。
通过$().data存储、获取数据。
代码大体框架:
var data_user, data_priv, rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
rmultiDash = /([A-Z])/g;
function Data() {
}
Data.uid = 1;
Data.accepts = function(owner) {
}
Data.prototype = {
key: function(){
},
set: function(){
},
get: function(){
},
access: function(){
},
remove: function(){
},
hasData: function(){
},
discard: function(){
},
}
data_user = new Data();
data_priv = new Data();
jQuery.extend({
acceptData: Data.accepts,
hasData: function(){
},
data: function(){
},
removeData: function(){
},
_data: function(){
},
_removeData: function(){
},
});
jQuery.fn.extend({
data: function(){
},
removeData: function(){
}
});
function dataAttr(elem, key, data) {
}
jQuery,data相关功能的代码组成大致如上。
代码解析:
变量:
var data_user, data_priv, rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,rmultiDash = /([A-Z])/g;
先是创建了四个变量,其中data_user是面向用户的数据存储对象;data_priv是内部的数据存储对象;rbrace是正则,用于匹配大括号内或中括号内有任意多的任意字符的字符串;rmultiDash是一个正则,用于匹配单个A到Z的字符。
function Data():
function Data() {
Object.defineProperty(this.cache = {},
0, {
get: function() {
return {};
}
});
this.expando = jQuery.expando + Math.random();
}
创建Data的构造函数,内部this.cache = {},这个空对象。
使用Object.defineProperty,使得this.cache[0]只能被获取得到{},不能被赋值。
this.expando = jQuery.expando + Math.random(),jQuery.expando是一个属于jQuery对象的标识。这里相当于给Data创建一个标识。
Data.uid = 1;
用于表示添加了数据的节点的标识。
Data.accepts:
Data.accepts = function(owner) {
return owner.nodeType ? owner.nodeType === 1 || owner.nodeType === 9 : true;
};
一个函数,属于一个参数,如果参数有属性nodeType的话,判断这个参数是不是节点(document或者普通的dom节点),是的话返回true;没有属性nodeType 的话,直接返回true(这是被是视作是普通对象object)。(感觉这个不是很严谨,而且最新的3.5.1版本也已经改成了新的判断方式 owner.nodeType === 1 || owner.nodeType === 9 || !(+owner.nodeType) )。
Data.prototype:
Data构造函数的原型。
-
key:
key: function(owner) {
if (!Data.accepts(owner)) {
return 0;
}
var descriptor = {},
unlock = owner[this.expando];
if (!unlock) {
unlock = Data.uid++;
try {
descriptor[this.expando] = {
value: unlock
};
Object.defineProperties(owner, descript