章节
问答
笔记
评论
占位
占位

实例方法的设计

前面的第三小节留下了一个疑问:jQuery.data() 与 .data()为什么会有区别?

jQuery的方法设计大都是多用的,可以根据传递参数的个数判断是set还是get处理,不仅如此jQuery还对参数的传递类型还抽出了一个处理的方法jQuery.access,我们可以传递字符串、数组、对象等等,根据这种类型自动分解成接口所有能接受的参数。

省略了部分,比如数据的过滤,HMLT5 data的处理之类,保留直接的处理,如下代码:

jQuery.fn.extend({
    data: function(key, value) {
      return access(this, function(value) {
        // 通过access解析出参数 value的值
      }, null, value, arguments.length > 1, null, true)
    })
}

通过access解析后的参数就能让data_user接口所接收,此时我们可以调用数据对象接口开始对数据进行存储设置了。

this.each(function() {
   var data = data_user.get( this, camelKey );
   data_user.set( this, camelKey, value );
});

因为jQuery可以是一个元素合集,所以内部需要通过each对每一个合集都遍历处理,

对数据的存储内部就是调用的data_user.get缓存类的接口。

get: function(owner, key) {
  var cache = this.cache[this.key(owner)];
  return key === undefined ?
    cache : cache[key];
}

通过get方法通过key去cache中取得之前的值,如果没有则新开辟一个空间用来存储之后的新值,

通过data_user.set去设置这个新的值:

set: function(owner, data, value) {
  var prop,
    unlock = this.key(owner),
    cache = this.cache[unlock];
  cache[data] = value;
  return cache;
}

取出cache中对应的存储空间,然后可见

cache[ data ] = value;

数据直接就是通过对象的键值对的方式存储在内存中的。

当我们重复同一个key的时候,其实是反复操作同一个cache缓存区下的同一个key

所以当下面:

cache[‘bar’] = {
     myType: "慕课网一",
});

cache[‘bar’] = {
     myType: "慕课网二",
});

这种情况下,肯定是被覆盖掉了。所以也就为什么通过实例的接口会覆盖数据了。

任务

?不会了怎么办
||

提问题

写笔记

截图
提交
||

请验证,完成请求

由于请求次数过多,请先验证,完成再次请求

加群二维码

打开微信扫码自动绑定

您还未绑定服务号

绑定后可得到

  • · 粉丝专属优惠福利
  • · 大咖直播交流干货
  • · 课程更新,问题答复提醒
  • · 账号支付安全提醒

举报

0/150
提交
取消
全部 精华 我要发布
全部 我要发布
最新 点赞
只看我的

手记推荐

更多

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?