参考文章
http://www.cnblogs.com/aaronjs/p/3370176.html
数据缓存这个东西平时可能不太有感觉,尤其是做一些简单的页面的时候,只有用到data-xx这样的存储在标签里的数据的时候,才会接触到,但还可能意识不到这是在使用jq的缓存,我以前以为$(’#dom’).data(‘data2’)就只是操作标签里的data-xx数据而已
两种形式可以定义缓存,
1.$.data('data1');
2.$('#dom').data('data2');
其中第二种如果对同一个dom进行操作是会覆盖的,而第一种不会
也就是说
var aa1 = $("body");
var aa2 = $("body");
$.data(aa1,"b","1111")
$.data(aa2,"b","2222")
$.data(aa1,"b") //结果111111
$.data(aa2,"b") //结果222222
aa1.data('a',1111);
aa2.data('a',2222);
aa1.data('a') //结果222222
aa2.data('a') //结果222222
例子摘自参考文章
首先jq中有一个叫Data的构造函数,Data上有一个静态属性uid,是用来标识属性的key,还有一个静态函数accepts,用来判断传入的参数是否可以绑定自定义数据,DOM element节点和document节点以及object是可以绑定自定义数据的
在Data.prototype上面定义了这么些函数
- key 返回uid,通过expando直接作为属性赋到owner(也就是例子中的aa1和aa2)上,所以操作同一个key(也就是例子中的b)是不会覆盖的,并且如果传入一个常量是无效的,比如$.data(“bla”,“b”,“1111”)
- set
- get
- access 根据传入的参数判断是进行get操作还是set操作
- remove 删除,如果不传key,会把cache[uid]赋为{},key会检查驼峰写法的对应值存不存在,存在一样删除
- hasData
- discard 删除整个cache[uid]
然后jq定义了两个Data的实例,分别是data_user和data_priv
之后就是两个extend,一个扩展在jQuery上,这个就是第一种形式,一个扩展在jQuery.fn上,这个就是第二种形式。第一种形式的函数都是对两个Data实例的函数的调用,第二种形式自己重新写了data函数,其中的注释写的很仔细,自己看的话,会遇到一个access函数,不容易理解,总之最后是调用了传给access的回调函数,第二种形式设置的值之所以会覆盖,是因为它的data函数里有这么一句elem = this[ 0 ]
,对着例子来说,就是aa1.data('a',1111);
和
aa2.data('a',2222);
的时候,其实操作的都是body元素,而不是$('body')
,这样就比较清楚了
这次看Data的代码的感受是,以前太不注意注释了,大概是因为个人习惯原因,一直都是先关注代码,把注释忽略掉,然后后面慢慢的会发现有些花了很多力气去看去分辨的代码逻辑,其实注释里面已经写了,争取慢慢的改进这点。
最近的业务比较多,很久没写文章,大部分时间都在写业务代码,没什么技术含量,自己看东西的时间比较少,但是也学到了一些东西,希望过段时间能有更多闲暇自己学习吧。