JavaScript中的memorizing技术
今天看《JavaScript》设计模式第七章--工厂模式的时候接触到memorizing技术,简单的说就是对于某个方法,调用它的实例只在第一次调用它的时候才会进行方法中的计算,之后该实例再次调用该方法的时候就不在需要进行代码中的计算了,而是直接使用第一次调用时的计算结果。
先来看一段简单的代码,主要功能是用来得知今天星期几,当然要实现这功能完全不需要我这样复杂的代码,只是为了说明这技术。
function weekDay(){};
weekDay.prototype = {
today: function(){
var a = this.getweekDay();
return a;
},
getweekDay: function(){
var day = new Date().getDay(),
str = "今天是周";
switch(day){
case 1:
str += "一";
alert(str);
break;
case 2:
str += "二";
alert(str);
break;
case 3:
str += "三";
alert(str);
break;
case 4:
str += "四";
alert(str);
break;
case 5:
str += "五";
alert(str);
break;
case 6:
str += "六";
alert(str);
break;
case 7:
str += "日";
alert(str);
break;
default:
break;
}
// memorizing技术实现
this.getweekDay = function(){
return str;
}
return str;
}
};
我们在控制台中来测试一下:
var b = new weekDay();
b.today() //跳出alert窗口(“今天是周三”) //我们再运行一次
b.today() //没有跳出alert弹窗
可以看到第一次运行之后之后b再调用today方法不会再去走getweekDay中的switch语句,取而代之的是
this.getweekDay = function(){
return str;
}
因为我们第一次调用的时候已经把结果写在了str中,并相当于重写了getweekDay方法。今天就是周三,之后没必要再去计算。当然你重新创建一个实例之后,调用today方法的时候还会去走getweekDay中的switch语句,因为对于该实例,是第一次调用这方法,还没有对getweekDay重写。
我们来看一看《JavaScript设计模式》中的代码
/* SimpleHandler class. */ var SimpleHandler = function() {}; // implements AjaxHandler
SimpleHandler.prototype = {
request: function(method, url, callback, postVars) {
var xhr = this.createXhrObject();
xhr.onreadystatechange = function() {
if(xhr.readyState !== 4) return;
(xhr.status === 200) ?
callback.success(xhr.responseText, xhr.responseXML) :
callback.failure(xhr.status);
};
xhr.open(method, url, true);
if(method !== 'POST') postVars = null;
xhr.send(postVars);
},
createXhrObject: function() { // Factory method.
var methods = [
function() { return new XMLHttpRequest(); },
function() { return new ActiveXObject('Msxml2.XMLHTTP'); },
function() { return new ActiveXObject('Microsoft.XMLHTTP'); }
]; for(var i = 0, len = methods.length; i < len; i++) {
try {
methods[i]();
}
catch(e) {
continue;
}
// If we reach this point, method[i] worked.
this.createXhrObject = methods[i]; // Memoize the method.
return methods[i];
} // If we reach this point, none of the methods worked.
throw new Error('SimpleHandler: Could not create an XHR object.');
}
};
主要用于根据不同浏览器创建不同XHR对象,红字那一行就是memorizing技术的实现。可以想见如果不管方法中进行多么复杂的计算,之后再次调用的时候就能得到计算结果,没必要重新计算了。所以此后只有针对当前浏览器的代码会得到执行,假如前面的代码运行在一个支持XMLHttpRequest类的浏览器中,那么第二次执行时的createXhrObject方法实际上是这样的:
createXhrObject: ffunction() { return new XMLHttpRequest(); }
memorizing技术能够有效的提高代码效率,因为设置和检测代码只会执行一次。
参考资料:JavaScript设计模式(Ross Harmes / Dustin Diaz) 第七章--工厂模式
JavaScript中的memorizing技术的更多相关文章
- [技术翻译]在现代JavaScript中编写异步任务
本周再来翻译一些技术文章,本次预计翻译三篇文章如下: 04.[译]使用Nuxt生成静态网站(Generate Static Websites with Nuxt) 05.[译]Web网页内容是如何影响 ...
- javascript中的操作符详解1
好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...
- 前端开发:面向对象与javascript中的面向对象实现(一)
前端开发:面向对象与javascript中的面向对象实现(一) 前言: 人生在世,这找不到对象是万万不行的.咱们生活中,找不到对象要挨骂,代码里也一样.朋友问我说:“嘿,在干嘛呢......”,我:“ ...
- 前端开发:Javascript中的数组,常用方法解析
前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...
- 【总结】浅谈JavaScript中的接口
一.什么是接口 接口是面向对象JavaScript程序员的工具箱中最有用的工具之一.在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概 ...
- 【优雅代码】深入浅出 妙用Javascript中apply、call、bind
这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: “对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂的知识.我 ...
- 【转】JavaScript中的原型和继承
请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans ...
- 【转】十个JavaScript中易犯的小错误,你中了几枪?
目录 常见错误一:对于this关键词的不正确引用 常见错误二:传统编程语言的生命周期误区 常见错误三:内存泄露 常见错误四:比较运算符 常见错误五:低效的DOM操作 常见错误6:在for循环中的不正确 ...
- 【原】理解javascript中的闭包
闭包在javascript来说是比较重要的概念,平时工作中也是用的比较多的一项技术.下来对其进行一个小小的总结 什么是闭包? 官方说法: 闭包是指有权访问另一个函数作用域中的变量的函数.创建闭包的常见 ...
随机推荐
- hdu 4407 Sum
http://acm.hdu.edu.cn/showproblem.php?pid=4407 题意:给定初始n个数1..n,两个操作,①1 x y p 询问第x个数到第y个数中与p互质的数的和; ② ...
- zoj 3758 Singles' Day
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5203 题意:有n个1然后按照b进制转化为10进制数,判断这个数是不是素数. # ...
- poj 2516Minimum Cost
http://poj.org/problem?id=2516 #include<cstdio> #include<cstring> #include<algorithm& ...
- 如何使用mysql
1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...
- Delphi TcxtreeList控件说明 转
Delphi TcxtreeList控件说明 树.cxTreeList 属性: Align:布局,靠左,靠右,居中等 AlignWithMargins:带边框的布局 Anchors:停靠 (akT ...
- 酷派D530刷机指引
酷派D530是我的第一台智能手机,刚入手的时候是挺激动的,什么Root啦,精简系统删官方应用啦,app2sd啦,杂七杂八的应用装了一堆,折腾得不亦乐乎.但过了那个热度之后,现在我对于智能手机的要求还是 ...
- HDU5032 -- Always Cook Mushroom 树状数组 14年北京网络赛
题意:1000*1000的格子, 坐标为(1, 1) ~ (1000, 1000), 常数 A, B, 点(x, y)权值为 (x + A) * (y + B), q次询问, 每次询问(0, 0) ...
- Android-Uiautomator:[5]停止monkey测试
方法/步骤 1 其实停止很简单,无非就是结束掉monkey的进程即可 如何停止呢 2 ps命令 查找uiautomator的进程 打开cmd命令行窗口 输入: adb shell ps | grep ...
- Remember the Word,LA3942(Trie树+DP)
Trie树基础题,记录下代码. #include <cstdio> #include <cstring> #define MaxNode 4005*100 #define No ...
- POJ Farm Tour
Farm Tour 题目: 约翰有N块地,家在1号,而N号是个仓库.农场内有M条道路(双向的),道路i连接这ai号地和bi号地,长度为ci. 约翰希望依照从家里出发,经过若干地后达到仓库.然后再返回家 ...