实现摘要:通过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);
}
分享到:
相关推荐
可以通过检查`window.localStorage`是否存在来实现。如果该对象存在,说明浏览器支持localStorage。 ```javascript if (typeof(Storage) !== "undefined") { // 支持localStorage } else { // 不支持localStorage...
通过这样的实现,开发者可以在前端应用中方便地使用带有过期时间的`localStorage`缓存,从而更好地管理用户数据,提高应用程序的性能和用户体验。同时,这种策略也可以应用于其他需要本地缓存的场景,例如存储用户...
在Web开发中,数据存储是不可或缺的一部分,尤其是在客户端进行离线存储时。`localStorage` 是HTML5引入的一种本地存储机制,允许web应用在浏览器中存储大量数据,且这些数据不会在用户关闭浏览器后丢失。本篇文章将...
通过localStorage实现留言板的功能,点击添加即可新增留言,可对留言进行修改及删除功能。
当然,实际应用中可能还需要处理更多的细节,比如数据大小限制(localStorage的存储空间通常为5MB)、数据过期清理、用户手动清除缓存等。但以上的基本流程已经足以构建一个基本的草稿保存功能。在实践中,可以结合...
总结来说,这个项目综合运用了前端开发的基本技术,通过HTML构建用户界面,CSS进行美化,JavaScript(ES6)和jQuery处理交互逻辑,以及LocalStorage实现数据持久化,从而实现了一个简单易用的学生信息管理平台。...
通过以上分析可以看出,本文介绍的`localStorage`工具类不仅实现了基本的缓存设置与获取功能,还引入了过期机制,能够有效地管理浏览器端的缓存数据。这对于提高前端应用的性能和用户体验具有重要意义。在实际项目中...
"jquery通过cookie和localStorage实现前端数据交互源码.rar"这个资源将帮助我们理解如何利用jQuery来处理和管理用户数据,包括使用Cookie进行短期、小量数据存储,以及利用localStorage实现长期、大量数据的本地存储...
在“HTML5实现的本地缓存localstorage登录效果实例代码.zip”这个压缩包中,我们可以期待找到一个展示如何利用Local Storage来实现在用户登录后保持登录状态的示例。这个实例对于开发者来说非常有价值,因为它能帮助...
"本地缓存JSCSS.zip"这个压缩包文件提供了一种方法,通过利用浏览器的localStorage功能来存储JavaScript(JS)和样式表(CSS)文件,从而减少HTTP请求次数,优化页面加载时间。这种技术被称为本地缓存,它在现代Web...
标题中的“一个可以将静态资源jscss缓存到本地localStorage的小工具”指的是一个JavaScript应用程序,它的主要功能是帮助开发者将网站的静态资源,如JavaScript(js)和样式表(css)文件,存储在用户的浏览器本地...
实现方法: 单个商品加入购物车| 商品批量加入购物车| 删除单个商品| 批量删除商品| 清空购物车| 增减购物车某个商品的数量| 修改购物车某个商品的数量| 查询购物车中某个商品的数量| 查询购物车商品列表| ...
在这个基于Vue的本地记事本项目中,开发者结合了Vuex和localStorage来构建一个功能齐全的应用。接下来,我们将深入探讨这些技术及其在项目中的应用。 1. **Vue.js**:Vue的核心特性包括声明式渲染、响应式数据绑定...
"storejs本地存储localstorage的封装提供简单的API没有依赖" 这个标题告诉我们,storejs是一个专门针对浏览器本地存储机制——localStorage的轻量级库。它通过封装localStorage,为开发者提供了更易用的API接口,...