`
三里小龙
  • 浏览: 87590 次
  • 性别: Icon_minigender_1
  • 来自: 孝感
社区版块
存档分类
最新评论

通过map结合localstorage实现简单可调配的本地缓存

    博客分类:
  • Web
阅读更多

实现摘要:通过Array和Object实现Map存储,通过localStorage实现本地缓存,通过函数代理注册传入函数(如回调函数等)。代理函数用来将传入函数添加为自身属性或成员方法以便调用,即代理函数就是一种反射方式。另外,Map存储中含有将Object转换为JSON对象和JSON字符串的方法,可以供需而用。以下是具体实现方式:

 

 

/**注册函数域*/

if(typeof noneorone == 'undefined'){

//根域

noneorone = {};

//工具域

noneorone.util = {};

//测试域

noneorone.test = {};

}

 

/**

 * map存储

 * @date 2012-02-03

 * @author sunnysolong

 */

noneorone.util.map = (function(){

/*键集合*/

this.keys = new Array();

/*数据存储对象*/

this.data = new Object();

 

/**

* 为缓存对象添加键值对

* @param {String} key

* @param {String} value

*/

this.put = function(key,value){

if(null == this.data[key]){

//若指定的键不存在,则向键集合中追加该键

this.keys.push(key);

}

//将对应的值与键关联

this.data[key] = value;

return data;

};

/**

* 返回指定键关联的值

* @param {Object} key

* @return {Object} 与键对应的值

*/

this.get = function(key){

//检索键对应值并返回

return this.data[key];

};

 

/**

* 返回已存储大小

* @return {Integer} 目前已存储容量

*/

this.size = function(){

//键集合大小就是已存容量

return this.keys.length;

};

/**

* 通过键删除指定的键值对

* @param {String} key

*/

this.remove = function(key){

//删除键

this.keys.remove(key);

//清空对应的存储值

this.data[key] = null;

};

/**

* 删除所有键值对

*/

this.removeAll = function(){

for(var i=0; i<this.size(); i++){

//循环所有元素,调用移除单个元素的方法依次删除

this.remove(this.keys[i])

}

};

/**

* 获取已存储的所有对象集合

* @return {Array}

*/

this.entrySet = function(){

//重建同级容量的数组,用来存储原始存储对象中所有元素

var entries = new Array(this.size());

for(var i=0; i<this.size(); i++){

//迭代集合元素,并以键值对方式存储在定义的实体集合中

entries[i] = {key: this.keys[i], value: this.data[this.keys[i]]}

}

//返回该实体集合

return entries;

};

/**

* 将键值对转为json串

* @return {String} 返回转换后的字符串

*/

this.toString = function(){

var jsonStr = new String('{');

for(var i=0; i<this.size(); i++){

jsonStr += '"'+this.keys[i]+'":"'+this.data[this.keys[i]]+'",';

}

jsonStr.substring(0, jsonStr.lastIndexOf(','));

return jsonStr.concat('}');

},

/**

* 将键值对封装成JSON对象

* @return {Object} 返回JSON对象

*/

this.toJSON = function(){

var obj = new Object({});

for(var i=0; i<this.size(); i++){

obj[this.keys[i]] = this.data[this.keys[i]];

}

return obj;

}

}); 

 

 

/**

 * 本地缓存处理

 * @author wangmeng

 * @date 2012-02-10

 */

noneorone.util.cache = ({

 

/*元数据存储*/

data: new noneorone.util.map,

/*模型数据存储*/

model: new noneorone.util.map,

/**

* 存储数据

* @param {Integer} cityId

* @param {String} modelId

* @param {String} cacheKey

* @param {String} cacheValue

*/

storeData: function(cityId, modelId, cacheKey, cacheValue){

this.data.put(cacheKey, cacheValue);

this.model.put(modelId, this.data.toJSON());

localStorage.setItem(cityId, JSON.stringify(this.model.toJSON()));

},

/**

* 获取数据

* @param {String} cityId

* @param {String} modelId

* @param {String} cacheKey

* @param {Function} callBack

*/

getData: function(cityId, modelId, cacheKey, callBack){

var value = JSON.parse(localStorage.getItem(cityId))[modelId][cacheKey];

noneorone.util.ReflectProxy.passParam(callBack, value);

},

/**

* 删除数据

*/

removeData: function(){

this.data.removeAll();

this.model.removeAll();

localStorage.remove();

}

});

 

/**

 * 代理map

 */

noneorone.util.proxyMap = ({

/**存放关联值*/

map: new noneorone.util.map(),

/**注册函数*/

reg: function(key, value){

this.map.put(key, value);

return map;

},

/**获取存储函数集*/

getStore: function(){

return this.map;

}

});

 

 

/**

 * 代理工厂

 */

noneorone.util.proxyFactory = (function(){

var proxyMap = noneorone.util.proxyMap.getStore();

for(var i=0; i<proxyMap.size(); i++){

var key = proxyMap.keys[i], value = proxyMap.data[key];

this[key] = value;

}

});

 

 

/**

 * 反射代理

 * @type Function | Object

 */

noneorone.util.ReflectProxy = ({

 

/**

* 注册函数(对象)

* @param {String} id: 标识

* @param {Function} fn: 函数(对象)

*/

reg: function(id, fn){

noneorone.util.proxyMap.reg(id, fn);

},

/**

* 参数传递

* @param {String} id: 标识

* @param {String} param: 参数

*/

passParam: function(id, param){

new noneorone.util.proxyFactory()[id](param);

}

});

 

 

/**

 * 缓存测试

 */

noneorone.test.store = (function(){

//注册函数对象

noneorone.util.ReflectProxy.reg('callback-test', noneorone.test.callBackTest);

//数据存储本地缓存

noneorone.util.cache.storeData(757, 'community', 'peopleWords', 'da jia zai shuo ...');

//获取本地缓存数据

noneorone.util.cache.getData(757, 'community', 'peopleWords', "callback-test");

});

 

 

/**

 * 回调测试

 * @param {Object} value: 返回值

 */

noneorone.test.callBackTest = function(value){

alert('returned_value >>> '+value);

}


分享到:
评论

相关推荐

    JS localStorage实现本地缓存的方法

    可以通过检查`window.localStorage`是否存在来实现。如果该对象存在,说明浏览器支持localStorage。 ```javascript if (typeof(Storage) !== "undefined") { // 支持localStorage } else { // 不支持localStorage...

    localstorage实现带过期时间的缓存功能

    通过这样的实现,开发者可以在前端应用中方便地使用带有过期时间的`localStorage`缓存,从而更好地管理用户数据,提高应用程序的性能和用户体验。同时,这种策略也可以应用于其他需要本地缓存的场景,例如存储用户...

    使用localStorage缓存js

    在Web开发中,数据存储是不可或缺的一部分,尤其是在客户端进行离线存储时。`localStorage` 是HTML5引入的一种本地存储机制,允许web应用在浏览器中存储大量数据,且这些数据不会在用户关闭浏览器后丢失。本篇文章将...

    LocalStorage实现留言板功能

    通过localStorage实现留言板的功能,点击添加即可新增留言,可对留言进行修改及删除功能。

    利用localStorage实现对ueditor编辑内容定时保存为草稿

    当然,实际应用中可能还需要处理更多的细节,比如数据大小限制(localStorage的存储空间通常为5MB)、数据过期清理、用户手动清除缓存等。但以上的基本流程已经足以构建一个基本的草稿保存功能。在实践中,可以结合...

    LocalStorage+HTML+CSS+jQuery 实现简易的学生管理系统

    总结来说,这个项目综合运用了前端开发的基本技术,通过HTML构建用户界面,CSS进行美化,JavaScript(ES6)和jQuery处理交互逻辑,以及LocalStorage实现数据持久化,从而实现了一个简单易用的学生信息管理平台。...

    vue实现localStorage工具类

    通过以上分析可以看出,本文介绍的`localStorage`工具类不仅实现了基本的缓存设置与获取功能,还引入了过期机制,能够有效地管理浏览器端的缓存数据。这对于提高前端应用的性能和用户体验具有重要意义。在实际项目中...

    jquery通过cookie和localStorage实现前端数据交互源码.rar

    "jquery通过cookie和localStorage实现前端数据交互源码.rar"这个资源将帮助我们理解如何利用jQuery来处理和管理用户数据,包括使用Cookie进行短期、小量数据存储,以及利用localStorage实现长期、大量数据的本地存储...

    HTML5实现的本地缓存localstorage登录效果实例代码.zip

    在“HTML5实现的本地缓存localstorage登录效果实例代码.zip”这个压缩包中,我们可以期待找到一个展示如何利用Local Storage来实现在用户登录后保持登录状态的示例。这个实例对于开发者来说非常有价值,因为它能帮助...

    本地缓存JSCSS.zip

    "本地缓存JSCSS.zip"这个压缩包文件提供了一种方法,通过利用浏览器的localStorage功能来存储JavaScript(JS)和样式表(CSS)文件,从而减少HTTP请求次数,优化页面加载时间。这种技术被称为本地缓存,它在现代Web...

    一个可以将静态资源jscss缓存到本地localStorage的小工具

    标题中的“一个可以将静态资源jscss缓存到本地localStorage的小工具”指的是一个JavaScript应用程序,它的主要功能是帮助开发者将网站的静态资源,如JavaScript(js)和样式表(css)文件,存储在用户的浏览器本地...

    localStorage实现本地购物车

    实现方法: 单个商品加入购物车| 商品批量加入购物车| 删除单个商品| 批量删除商品| 清空购物车| 增减购物车某个商品的数量| 修改购物车某个商品的数量| 查询购物车中某个商品的数量| 查询购物车商品列表| ...

    Vue开发-基于vue+vuex+localstorage实现的本地记事本项目.zip

    在这个基于Vue的本地记事本项目中,开发者结合了Vuex和localStorage来构建一个功能齐全的应用。接下来,我们将深入探讨这些技术及其在项目中的应用。 1. **Vue.js**:Vue的核心特性包括声明式渲染、响应式数据绑定...

    storejs本地存储localstorage的封装提供简单的API没有依赖

    "storejs本地存储localstorage的封装提供简单的API没有依赖" 这个标题告诉我们,storejs是一个专门针对浏览器本地存储机制——localStorage的轻量级库。它通过封装localStorage,为开发者提供了更易用的API接口,...

Global site tag (gtag.js) - Google Analytics