jQuery源码笔记——数据缓存
数据缓存是为了解决内存泄露,他的原理是,当我们将数据存储到一个对象上面,实际上是将所有的数据存到一个单独的数据对象里,而这个对象只提供一个接口,这个接口可以访问自己存在数据对象里自己的数据。
这是一个简单的数据缓存
var cache= {};
function set(obj,name,value){
//在对象上存储一个属性,用作访问数据的接口
obj.expando = 1;
//初始化对象,并在我们接口所提供的位置存放数据
cache[obj.expando] = {}
cache[obj.expando][name] = value
}
function get(obj,name){
//实际就是通过对象上的expando指定在数据中位置去访问的自己的数据。
return cache[obj.expando][name]
}
var obj2 = {};
set(obj2,"name","winder");
console.log(get(obj2,"name")) //winder
console.log(obj2) // Object { expando: 1}
console.log(cache[1]) // Object { name: "winder" }
由代码可以很清楚看到,我们实际访问的是数据对象中,1引用的对象;而如何找到数据的位置,则由存储在对象上的一个接口属性提供。
当我们把他运用在jQuery中
//mini的jQuery框架。
var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
};
jQuery.fn = jQuery.prototype = {
selector: "",
init: function(selector){
var result = document.querySelectorAll(selector);
for(var i = 0;i < result.length;i++){
this[i] = result[i]
}
this.length = result.length;
},
constructor : jQuery
}
jQuery.fn.init.prototype = jQuery.fn; //定义date构造函数
function Data(){
this.cache = {}
//默认带有随机数属性
this.expando = Math.random()
}
//设置在数据对象中的位置的辅助属性
Data.uid = 1;
Data.prototype = {
//判断对象是否有接口属性,
//没有接口时,新建接口
key: function( owner ) { var descriptor = {},
unlock = owner[ this.expando ];
if ( !unlock ) {
unlock = Data.uid++; descriptor[ this.expando ] = { value: unlock };
Object.defineProperties( owner, descriptor ); }
//确保在缓存中存在
if ( !this.cache[ unlock ] ) {
this.cache[ unlock ] = {};
}
return unlock;
},
//向缓存中添加数据
set: function( owner, data, value ) {
var unlock = this.key( owner );
var cache = this.cache[ unlock ];
cache[ data ] = value; return cache;
},
//获取数据
get: function( owner, key ) {
var cache = this.cache[ this.key( owner ) ]; return cache[ key ];
},
//access实际就是一个访问路由,根据参数判断是设置还是获取
access: function( owner, key, value ) {
//访问
if ((typeof key === "string") && value === undefined ) { return this.get( owner, key );
}
//设置
this.set( owner, key, value ); return value
},
}
var data_user = new Data()
jQuery.data = function( elem, name, data ) {
return data_user.access( elem, name, data );
}
//测试
var obj = {}
jQuery.data(obj,"name","winder")
console.log(jQuery.data(obj,"name")) //winder
console.log(obj) //里面的里面是0.6637197330750032:1
console.log(data_user.cache[1])//Object { name: "winder" }
采用向对象中添加随机数属性,是为了屏蔽除内部外任何访问,保证缓存中数据安全。
添加jQuery对象方法
//mini的jQuery框架。
var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
};
jQuery.fn = jQuery.prototype = {
selector: "",
init: function(selector){
var result = document.querySelectorAll(selector);
for(var i = 0;i < result.length;i++){
this[i] = result[i]
}
this.length = result.length;
},
constructor : jQuery
}
jQuery.fn.init.prototype = jQuery.fn; //定义date构造函数
function Data(){
this.cache = {}
//默认带有随机数属性
this.expando = Math.random()
}
//设置在数据对象中的位置的辅助属性
Data.uid = 1;
Data.prototype = {
//判断对象是否有接口属性,
//没有接口时,新建接口
key: function( owner ) { var descriptor = {},
unlock = owner[ this.expando ];
if ( !unlock ) {
unlock = Data.uid++; descriptor[ this.expando ] = { value: unlock };
Object.defineProperties( owner, descriptor ); }
//确保在缓存中存在
if ( !this.cache[ unlock ] ) {
this.cache[ unlock ] = {};
}
return unlock;
},
//向缓存中添加数据
set: function( owner, data, value ) {
var unlock = this.key( owner );
var cache = this.cache[ unlock ];
cache[ data ] = value; return cache;
},
//获取数据
get: function( owner, key ) {
var cache = this.cache[ this.key( owner ) ]; return cache[ key ];
},
//access实际就是一个访问路由,根据参数判断是设置还是获取
access: function( owner, key, value ) {
//访问
if ((typeof key === "string") && value === undefined ) { return this.get( owner, key );
}
//设置
this.set( owner, key, value ); return value
},
}
var data_user = new Data()
jQuery.data = function( elem, name, data ) {
return data_user.access( elem, name, data );
}
//简化的jQuery对象API方法
jQuery.fn.data = function( key, value ){
for(var i = 0;i < this.length; i++){
return jQuery.data(this[i],key,value)
}
}
//测试
var $emample = jQuery("#example")
$emample.data("name","winder");
console.log($emample.data("name")) //winder
这是一个极简化的API。而在原版jQuery当中,细致考虑了多种情况。
jQuery源码笔记——数据缓存的更多相关文章
- 【菜鸟学习jquery源码】数据缓存与data()
前言 最近比较烦,深圳的工作还没着落,论文不想弄,烦.....今天看了下jquery的数据缓存的代码,参考着Aaron的源码分析,自己有点理解了,和大家分享下.以后也打算把自己的jquery的学习心得 ...
- jQuery源码解读 - 数据缓存系统:jQuery.data
jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...
- jQuery1.9.1源码分析--数据缓存Data模块
jQuery1.9.1源码分析--数据缓存Data模块 阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(el ...
- jQuery源码笔记(一):jQuery的整体结构
jQuery 是一个非常优秀的 JS 库,与 Prototype,YUI,Mootools 等众多的 Js 类库相比,它剑走偏锋,从 web 开发的实用角度出发,抛除了其它 Lib 中一些中看但不实用 ...
- jQuery 2.0.3 源码分析 数据缓存
历史背景: jQuery从1.2.3版本引入数据缓存系统,主要的原因就是早期的事件系统 Dean Edwards 的 ddEvent.js代码 带来的问题: 没有一个系统的缓存机制,它把事件的回调都放 ...
- jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}
笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...
- JavaScipt 源码解析 数据缓存
常见的内存泄露的几种情况: 循环引用 JavaScript闭包 DOM插入 一个DOM对象被一个JavaScript对象引用,同时又引用同一个或其他的JavaScript对象,这个DOM对象可能回引发 ...
- jQuery源码笔记——回调对象
回调对象是一个多用途的回调列表对象,提供了强大的的方式来管理回调函数列表. 最简单的缓存对象 function Callbacks(){ var list = [], self = { add: fu ...
- jQuery源码笔记——延迟对象
提供一种方法来执行一个或多个对象的回调函数, Deferred对象通常表示异步事件. 它是回调对象的拓展运用,在jQuery当中非常依赖回调对象. 一个简单的,只解决成功状态下的缓存实例 functi ...
随机推荐
- JqueryeasyUI选项卡选择判定更改内部Iframe地址
1.tabs的常用操作 //1.判断tab是否存在. var currtab = $('#tabs').tabs('getSelected'); //2.判断点击的tab是否是当前选中的tab. va ...
- OC基础5:继承
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.根类即是最顶层的类,父类也可称为超类: ...
- java中substring的使用方法
java中substring的使用方法 str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str: str ...
- 聚类算法初探(六)OPTICS
最近由于工作需要,对聚类算法做了一些相关的调研.现将搜集到的资料和自己对算法的一些理解整理如下,供大家参考. 另外在算法代码方面,我也做了一些实现(包括串行和并行),欢迎感兴趣的朋友探讨和交流. 第一 ...
- 搭建PhoneCat项目的开发与测试环境
AngularJS官方网站提供了一个用于学习的示例项目:PhoneCat.这是一个Web应用,用户可以浏览一些Android手机,了解它们的详细信息,并进行搜索和排序操作. 获取源代码 PhoneCa ...
- LeetCode Day5——House Robber
问题描述: 意思就是说:给定一个数组,寻找一种选取方法,使得在保证任何两个相邻元素不同时被选的条件下得到的数值总和最大. 1. 递归 设nums为数组首地址,numsSize为数组的大小,max[i] ...
- SqLiter
1.去重 select * from daydata where wtid||rectime in (select wtid||rectime from daydata group by wtid| ...
- foreach 和for语句比较
1.首先想到循环就是执行效率的问题,参考博客http://www.cnblogs.com/yzxchoice/archive/2007/12/15/995949.html 2. 测试时候发现出现“ ...
- DoNet开源项目-基于Amaze UI的点餐系统
帮朋友做的点餐系统,主要是为了让顾客在餐桌上,使用微信扫描二维码,就可以直接点菜,吃完使用微信付款. 系统演示地址,账户名和密码均为:admin.(请不要删除admin用户) GitHub Clone ...
- Nodejs随笔(二):像可执行shell脚本一样,运行node 脚本!
在每次编写nodejs脚本的时候,只需在程序的开头加上如下代码(写过shell脚本的人应该很熟悉): #!/usr/local/bin/node 同时,修改文件权限为可执行: mesogene@mes ...