js面向对象编程:数据的缓存

js也可以通过缓存数据,来加快处理速度。在必要的时候使用空间还换取时间还是值得的。例如需要很长时间才能完成的计算,就可以把计算结果缓存到客户端,以后就可以直接使用缓存的计算结果,不在重复计算。

1简单函数的计算结果的缓存 2递归函数的计算结果的缓存  3Ajax读取数据的缓存

1简单函数的计算结果的缓存

例如:

     //共用函数,封装内部调用,缓存计算结果
     function memorize(f)
		 {
		  var cache={};
		  return function(){
		   var key=arguments.length+Array.prototype.join.call(arguments,",");//参数长度和参数作为属性值
		   if(key in cache) //存在则直接读取缓存数据
		   {
		     return cache[key];
		   }
		   else
		   {
		     return cache[key]=f.apply(this,arguments);//不存在,则计算,并缓存计算结果
		   }
		  }
		 }

具体使用

	 //模拟需要很长时间的计算的函数
    function TestFunction(x)
	{
	  return x*x;
	}

	  //测试,调用
	  function test(){
		   var t=memorize(TestFunction);
		     var k=t(6);//	第一次调用需要计算
		     var k2=t(6);//第二次直接读取换缓存,不在计算
			  alert(k2);
	     }

2递归函数的计算结果的缓存

具体使用

 function test2(){
		   var t=memorize( function(x){//递归函数计算X的阶乘
		     if(x<=0){return 1;}
	         else{ return x*t(x-1) }
		   });
		     var k=t(6);//缓存了6至1的阶乘
		     var k2=t(7);//只需要调用一次,计算6阶乘时使用了缓存
			  alert(k2);
	     }

3Ajax读取数据的缓存

  对于Ajax的缓存也可以使用类似的方式,其实还是从https://github.com/devbridge/jQuery-Autocomplete中学习来的

原理其实和上边的是一样的。

核心部分整理如下:

      function Autocomplete()
{
   this.cachedResponse = {};//缓存的数据保存的容器
   this.badQueries = [];//查询后,没有满足条件的查询

}
   Autocomplete.prototype.clearCache = function ()//清空缓存
   {
      this.cachedResponse = {};
     this.badQueries = [];
  },
  Autocomplete.prototype.getSuggestions=function (q) {//读取数据
            var response,
                that = this,
                options = that.options,
                serviceUrl = options.serviceUrl,
                data,
                cacheKey;
            options.params[options.paramName] = q;
            data = options.ignoreParams ? null : options.params;
            cacheKey = serviceUrl + '?' + $.param(data || {});//缓存的键是URL和传递的参数组成
            response = that.cachedResponse[cacheKey];//获取缓存的数据
            if (response && $.isArray(response.suggestions)) {//如果有缓存
                that.suggestions = response.suggestions;
                that.suggest();
            } else if (!that.isBadQuery(q)) {// 没有查询过,而且不是查询后没有满足条件的查询
                that.currentRequest = $.ajax({//没有缓存通过Ajax读取数据
                    url: serviceUrl,
                    data: data,
                    type: options.type,
                    dataType: options.dataType
                }).done(function (data) {
                    that.currentRequest = null;
                    that.processResponse(data, q, cacheKey);//缓存数据
                    options.onSearchComplete.call(that.element, q);
                }).fail(function (jqXHR, textStatus, errorThrown) {
                    options.onSearchError.call(that.element, q, jqXHR, textStatus, errorThrown);
                });
            }
        }

可以看到核心还是和上边的情况是一样的,只是缓存数据的键变成了Ajax的URL和传递的参数

js面向对象编程:数据的缓存

时间: 2024-08-06 10:24:04

js面向对象编程:数据的缓存的相关文章

简单粗暴地理解js原型链--js面向对象编程

简单粗暴地理解js原型链--js面向对象编程 原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧,想点与代码无关的事,比如人.妖以及人妖. 1)人是人他妈生的,妖是妖他妈生的.人和妖都是对象实例,而人他妈和妖他妈就是原型.原型也是对象,叫原型对象. 2)人他妈和人他爸啪啪啪能生出一堆人宝宝.妖他妈和妖他爸啪啪啪能生出一堆妖宝宝,啪啪啪就是构造函数,俗

js面向对象编程:如何实现方法重载

js中如何实现方法重载?这涉及到三个问题 1同名函数的调用问题 2函数中特殊的参数arguments 3如何利用arguments实现方法重载 1同名函数的调用问题 都知道在js中如果存在多个名称相同的函数,则调用实际每次都只使用最后一个,js其实是没有重载的,也就是说,如果定义了多个同名的函数,单参数不一样,在调用时,js不管参数个数,只管前后顺序 例如: function test1(arg1) { alert("参数1:"+arg1); } function test1(arg1

js面向对象编程:如何定义常量?

js中有一个关键字const,但目前的浏览器似乎还不支持,如果一定要定义一些常量,其实可以使用闭包,匿名函数实现常量的定义. 例如: var Class = (function() { var UPPER_BOUND = 100;//定义了常量 var Test={}; // 定义了一个静态方法 获取常量的方法 Test.getUPPER_BOUND=function() { return UPPER_BOUND; } return Test; })(); 用法: var k=Class.get

js面向对象编程:两个小括号的使用

在查看很多jQuery的过程中,经常遇到两个小括号的情况. 例如: (function() { alert("测试1"); })(); (function() { alert("测试3"); }()); 其实这段代码,就是定义了一个匿名函数,并且进行了调用, 相当于如下几行代码: (function ListCommon2() { alert("测试1"); })(); (function ListCommon3() { alert("

js面向对象编程:this到底代表什么?

在js中this的用法很让人迷惑,有些像Java或者C#中的this,但又不完全一样.按照流行的说法this总是指向调用方法的对象. 1.纯粹函数调用. function ListCommon2(x) { this.x=x; alert("this 是 ListCommon2"+(this instanceof ListCommon2)); alert("this.constructor"+this.constructor); } function test(){

js面向对象编程:如何检测对象类型

在js中检测对象类型主要有三种,typeof,instanceof,constructor,这几种都可以检测对象的类型,但又有一定的区别.   1使用typeof检测对象类型. typeo作为最常用的检测类型的方法,返回字符串类型,具体使用如下: function testType(value) { var str=typeof(value); // alert(str); switch(str) { case 'undefined': // undefined类型 case 'object'

JavaScript强化教程-JS面向对象编程

本文为H5EDU机构官方HTML5培训教程,主要介绍:JavaScript强化教程--JS面向对象编程  对事物的抽象描述  描述这类事物的特征和行为  对象是类的实例代码实现:创建一个类  function peple(){        this.hp=0;         this.act = 30;         this.name = "";         this.x=0;         this.y=0;         this.move =function(x,

js面向对象编程(二) 构造函数继承

构造函数绑定 //基类建筑物var building = function () {    this.spec = "building";}; //address:房子地址,toward:房子朝向var house = function (address, toward) {    this.address = address;    this.toward = toward;}; //使房子继承建筑物 //使用call或者apply方法,将父对象的构造函数绑定在子对象上,在子对象构造

js面向对象编程:this到底代表什么?第二篇

总认为自己弄明白了js中this的含义,this总是指向调用方法的对象,作为方法调用,那么this就是指实例化的对象.但前几天自己写脚本却遇到了一个很奇怪的问题. 代码如下: //内部对象AutoCompleteInner function AutoCompleteInner(transformResultInner) { if(transformResultInner) { this.transformResultInner=transformResultInner; } } AutoComp