缓存机制提供的入口有:

$.data([key],[value]) // 存取数据

$.hasData(elem) // 是否有数据

$.removeData([key]) // 删除数据

$.acceptData(elem) // 检测元素是否可以使用缓存机制存数据

$(elem).data([key],[value]) // 存取数据

$(elem).removeData([key]) // 删除数据

已经阅读了缓存机制为用户提供的入口,并且重点阅读了$(elem).data()方法(其它方法都是直接调用data_user对象的方法),

接下来重点看data_user对象封装的属性和方法

Data.prototype = {

  // 生成一个key使用它将cache和元素联系起来,并最终返回这个key
  key: function( owner ) {
    //如果owner不是元素节点或document节点,则返回0,为什么返回0?为了校验?
    if ( !Data.accepts( owner ) ) {
      return 0;
    }
    // 一个暂时的对象,将被扩展到owner对象上。
    var descriptor = {},
    // 判断owner对象上是否已经有这个jQuery随机产生的键。
    // 这里的this是后面new 出来的Data对象,所以其expando是固定的值,对在该data对象内存取数据的elem都是一致的
    unlock = owner[ this.expando ];

    // 如果没有这个键,则为owner对象创建一个。
    if ( !unlock ) {
      // 每次有新的对象想要调用data存储数据,都将uid增加1。保证唯一性。该uid是cache中的键
      unlock = Data.uid++;

      try {

        // 为descriptor添加属性(expando的值),将生成唯一id关联在descriptor上。
        descriptor[ this.expando ] = { value: unlock };

        // 再将descriptor关联在owner上,使owner最终和unlock关联起来,用于在cache中操作数据

        // 第二个参数应该是字符串?传一个对象进来不知道是怎么操作的,需要深入了解下definePropertyies方法
        Object.defineProperties( owner, descriptor );

      } catch ( e ) {

        // 处理元素上不能存对象的情况
        descriptor[ this.expando ] = unlock;
        jQuery.extend( owner, descriptor );
      }
    }

    // 如果cache[unlock]没有值,则将其值设置为空对象
    if ( !this.cache[ unlock ] ) {
      this.cache[ unlock ] = {};
    }
    //返回一个cache的索引
    return unlock;
  },
  set: function( owner, data, value ) {
    var prop,
      // 存数据之前,先调用key方法,拿到元素上绑定好的唯一UID,如果没有就创建一个
      unlock = this.key( owner ),

      // 根据这个UID到cache中拿到已经存储的数据,如果之前没有存储过,会返回一个空对象
      cache = this.cache[ unlock ];

    // 处理三个参数都存在的情况
    if ( typeof data === "string" ) {

      // 以data为键,以value为值将数据存储到cache中,如果之前存过就覆盖掉
      cache[ data ] = value;

    //处理只有两个参数,并且第二个参数是个对象的情况
    } else {
      // 如果cache中是空的
      if ( jQuery.isEmptyObject( cache ) ) {

        // 将data对象扩展到cache。不需要深度扩展?
        jQuery.extend( this.cache[ unlock ], data );
      // 如果不是空对象,需要一个一个赋值。?
      } else {
        for ( prop in data ) {
          cache[ prop ] = data[ prop ];
        }
      }
    }
    return cache;
  },
  get: function( owner, key ) {
    // 创建一个cache,将owner存储到Data对象的cache中的所有数据缓存起来。
    var cache = this.cache[ this.key( owner ) ];
    // 如果key存在则返回key对象的值,否则将owner上的所有值都返回。
    return key === undefined ?
    cache : cache[ key ];
  },
  // 剩下的四个方法下次再看。

  access : function(){},

  remove : function(){},

  hasData : function(){},

  discard : function(){}  // Data虽然封装了这个方法,但并没有暴露出来,也没有在内部使用。作用是删除owner存储到cache中的所有数据

};

jQuery缓存机制(三)的更多相关文章

  1. jQuery缓存机制(一)

    1.首先看一下涉及到jQuery缓存机制的代码结构: // 定义一些jQuery内部的变量,方便后续使用 var data_user, data_priv, // 后续会被赋值为两个Data对象 rb ...

  2. (五)JS学习笔记 - JQuery缓存机制

    历史背景 开发中常常因为方便,把状态标志都写到dom节点中,也就是HTMLElement,缺点: 循环引用 直接暴露数据,安全性? 增加一堆的自定义属性标签,对浏览器来说是没意义的 取数据的时候要对H ...

  3. jQuery缓存机制(四)

    Data封装的方法的后面四个方法 和 dataAttr方法阅读. Data.prototype = { key: function( owner ) {}, set: function( owner, ...

  4. jQuery缓存机制(二)

    1.从用户调用的入口开始阅读,因为这是我们比较熟悉的部分(主要做参数的调整,根据不同的完成不同的功能) // 进入jQuery Data模块的入口 使用方法有三种,不传参,传一个参,传两个参.示例$( ...

  5. jquery源码解析:jQuery数据缓存机制详解1

    jQuery中有三种添加数据的方法,$().attr(),$().prop(),$().data().但是前面两种是用来在元素上添加属性值的,只适合少量的数据,比如:title,class,name等 ...

  6. ContentType组件,Django缓存机制,跨域请求

    ContentType组件 解决什么问题:表的id和数据id,来唯一确定一条数据 用: 插入数据: models:content_obj = GenericForeignKey('table_id', ...

  7. contenttype组件、Django缓存机制以及跨域请求

    1 昨日回顾 版本控制 *** (1)url=127.0.0.1/course/?version=v100000 1 versioning_class=QueryParameterVersioning ...

  8. jquery源码解析:jQuery数据缓存机制详解2

    上一课主要讲了jQuery中的缓存机制Data构造方法的源码解析,这一课主要讲jQuery是如何利用Data对象实现有关缓存机制的静态方法和实例方法的.我们接下来,来看这几个静态方法和实例方法的源码解 ...

  9. 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...

随机推荐

  1. Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory

    Try this : sudo modprobe vboxnetadp ref: https://github.com/gasolin/foxbox/issues/32

  2. JAVA的get post 区别

    1. get 是从服务器上获取数据,post 是向服务器传送数据. get 请求返回 request - URI 所指出的任意信息.Post 请求用来发送电子邮件.新闻或发送能由交互用户填写的表格.这 ...

  3. 近期全国各地联通线路无法访问OA的解决方案

    最近有多地区使用联通线路的用户无法访问easyradius控制台,即oa.ooofc.com,其主要的原因是由于联通的DNS解析错误,导致的 oa.ooofc.com的解析IP是115.239.252 ...

  4. APK防反编译技术

    APK防反编译技术 下载地址:地址 我们的APK实际上就是一个ZIP压缩文件,里面包括有一个classes.dex.我们编译后生成的程序代码就所有在那里了, 通过apktool等工具能够轻松地将它们反 ...

  5. 性能分析Linux服务器CPU利用率

    CPU度量 1.  指标范围 1.1  User mode CPU utilization+ System mode CPU utilization 合理值:60-85%,如果在一个多用户系统中us+ ...

  6. SpringBoot整合cxf发布webService

    1. 看看项目结构图 2. cxf的pom依赖 1 <dependency>2 <groupId>org.apache.cxf</groupId>3 <art ...

  7. 在Unity3d中调用外部程序及批处理文件

    如果调用外部普通应用程序, 比如notepad.exe 这样调用 static public bool ExecuteProgram(string exeFilename, string workDi ...

  8. 【QT】Cannot find file: untitled.pro,项目路径不要包含中文。

    Cannot find file: D:\文件及下载相关\文档\untitled\untitled.pro. 17:01:45: 进程"D:\Englishpath\QT5.9.3\5.9. ...

  9. c# 开发window服务

    http://jingyan.baidu.com/article/fa4125acb71a8628ac709226.html 安装 cmd 输入 InstallUtil.exe E:\TestApp\ ...

  10. ubuntu alsa

    今天要在linux下搞音频编程,在网上查阅了一下资料,网上很多资料都是在linux下直接对/dev/dsp进行编程的,因为在以往的linux系统中,我们是可以通过cat  xxx.wav /dev/d ...