Javascript备忘模式

使用备忘模式,利用了函数的自定义属性,先看一个例子

var test = function (){}
test.myAttr = "attr";

这样,就给test加上了一个自定义的属性,myAttr。

备忘模式,正式利用了这个方法,将已经运行过的结果存储起来,将函数接受到的参数作为key,将函数运行的结果作为value返回即可。代码如下


var myFunc = function (param) {
if(!myFunc.cache[param]){
var result = {};
     //...各种操作
myFunc.cache[param] = result;
}
return myFunc.cache[param];
}
myFunc.cache = {};

上面的写法,只适用于参数只有一个的情况,但实际情况中不会都是这样,因此可以考虑将参数转化为字符串,作为缓存对象里的key值,以哈希对象的形式保存


var myFunc = function () {
//arguments 是myFunc的参数列表,格式给{"1":arg1,"2":arg2}
var cacheKey = JSON.stringify(Array.prototype.slice.call(arguments)),
result;
if(!myFunc.cache[cacheKey]){
result = {};
myFunc.cache[cacheKey] = result;
}
return myFunc.cache[cacheKey];
}
myFunc.cache = {};

这种方式用在哪用合适呢?

举个例子,电商里商品要按照不同的条件进行排序,用户很可能多次切换排序,如果这里是用ajax实现的,那根据sort的方式不同,查询结果将被保存,当再次选择已经选择过的排序方式的时候,获得数据将不用再次调用接口,直接用缓存里获得。现在还没有看过jquery的源码,不过,jquery的ajax方法里的cache,很可能就是用类似的方法实现的吧。举一反三吧,睡觉!

Javascript备忘模式,布布扣,bubuko.com

时间: 2024-11-04 10:17:32

Javascript备忘模式的相关文章

PHP设计模式之备忘模式

1.Norton Ghost的方便与问题 我们大多数win的用户都用过Norton Ghost,只要将目前系统备份一下生成镜像文件,等系统中毒或崩溃的时候,用Norton Ghost恢复一下就回到备份时候的样子了. 这个可以说就是备忘(Memento)模式的基本原理了,先备份,需要的时候恢复.因此备忘模式是比较好理解的. 但在实际应用中,如何正确的应用备忘模式,是需要注意的. 难道我们在word写文章的时候,先要Ghost备份一下所有的硬盘,一旦文章写错了,需要恢复,就用Ghost覆盖硬盘? 就

11. 星际争霸之php设计模式--备忘模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248190.html============================================

备忘模式

<?php //备忘类 class Memento { public $ore;//水晶矿 public $gas;//气矿 public $troop;//玩家所有的部队对象 public $building;//玩家所有的建筑对象 //构造方法,参数为要保存的玩家的对象,这里强制参数的类型为Player类 public function __construct(Player $player) { $this->ore = $player->ore;//保存这个玩家的水晶矿 $this

Javascript备忘复习笔记2

一.函数与形参 1.函数 function abs(x) { if (x >= 0) { return x; } else { return -x; } } alert(abs(-10)); 2.匿名函数 var abs = function (x) { if (x >= 0) { return x; } else { return -x; } } alert(abs(-10)); 3.argument传入参数 普通函数写法 function abs() { if (arguments.len

Javascript备忘复习笔记1

一.字符串操作 1.大小写 var s = "hello"; undefined g = s.toUpperCase(); "HELLO" g; "HELLO" g.toLowerCase(); "hello" 2.索引/截断 s.indexOf('o'); 4 all.js:1 loading comments... var l = "hello world"; undefined l.substring

javascript备忘笔记

1.填充VO的顺序是: 函数的形参 -> 函数申明 -> 变量申明. 首先,就是this值是如何定义的,当一个方法在对象上调用的时候,this就指向到了该对象上,例如: var object = { method: function() { alert(this === object); //true }}object.method(); function a() { alert(this);}a.call(null); 了解一下call()是做什么的,call方法作为一个function执行

正则表达式备忘(基于JavaScript)

基于JS学习的正则表达式 备忘 e.g.匹配以0开头的三位或四位区号,以-分格的7或8位电话号码var reg1 = /^0\d{2,3}\-\d{7,8}$/;或var reg1 = new RegExp('^0\\d{2,3}\\-\\d{7,8}$') ; reg1.test('010-1234567');reg1.test('010-12345678');reg1.test('0531-1234567');reg1.test('0531-12345678'); 第一种写法更简洁! #使用

调试android chrome web page简明备忘

必备工具 adb tools.android chrome 先开启手机调试模式 adb forward tcp:9919 localabstract:chromedevtoolsremote 成功会提示 * daemon not running. starting it now on port 5037 * * daemon started successfully * 不成功的话用这个命令再试 adb kill-server 接着打开下面的链接,这里的9919是上面adb命令中指定的 http

JqGrid相关操作备忘 方法列表

JqGrid相关操作备忘 方法列表 1.获得当前列表行数:$("#gridid").getGridParam("reccount"); 2.获取选中行数据(json):$("#gridid").jqGrid('getRowData', id); 3.刷新列表:$(refreshSelector).jqGrid('setGridParam', { url: ''), postData: ''}).trigger('reloadGrid'); 4.选