JavaScript设计模式读书笔记(四)= 技巧型设计模式
全系列目录
- JavaScript设计模式读书笔记(一)=> 创建型设计模式
- JavaScript设计模式读书笔记(二)=> 结构型设计模式
- JavaScript设计模式读书笔记(三)=> 行为型设计模式
- JavaScript设计模式读书笔记(四)=> 技巧型设计模式
- JavaScript设计模式读书笔记(五)=>架构型设计模式,MVC,MVP,MVVM
文章目录
- 1. 节流模式
- 2. 惰性模式
- 3. 参与者模式/函数柯里化
- 3.1. 柯里化例子1 =》参数复用
- 3.2. 柯里化例子2 =》 提前返回
- 3.3. 柯里化例子3 =》延迟计算
- 4. 等待者模式
1. 节流模式
这个单独找了搞了篇文章
https://blog.csdn.net/c_kite/article/details/90446725
2. 惰性模式
减少每次代码执行时的重复性的分支判断,通过对象的重定义来屏蔽原对象中的分支判断。下面来个浏览器的事件绑定兼容问题例子:
const A = {};
A.on = function (dom, type, fn) {if (dom.addEventListener) {A.on = function (dom, type, fn) {dom.addEventListener(type, fn, false);}} else if (dom.attachEvent) {A.on = function (dom, type, fn) {dom.attachEvent('on' + type, fn);}} else {A.on = function (dom, type, fn) {dom['on' + type] = fn;}}A.on(dom, type, fn);
}A.on(document.body, 'click', function() {alert('111')
})
3. 参与者模式/函数柯里化
书中本节写的比较水,推荐阅读 张鑫旭JS中的柯里化(currying),本小节代码转载此链接
柯里化定义:
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
https://baike.baidu.com/item/柯里化/10350525?fr=aladdin
简单来说就是所谓“柯里化”就是使函数理解并处理部分应用。
首先ES5中的bind
就是典型的柯里化,下面看个例子:
if (!function() {}.bind) {Function.prototype.bind = function(context) {var self = this, args = Array.prototype.slice.call(arguments);return function() {return self.apply(context, args.slice(1)); }};
}
3.1. 柯里化例子1 =》参数复用
- 官员取老婆
var currying = function(fn) {// fn 指官员消化老婆的手段var args = [].slice.call(arguments, 1);// args 指的是那个合法老婆return function() {// 已经有的老婆和新搞定的老婆们合成一体,方便控制var newArgs = args.concat([].slice.call(arguments));// 这些老婆们用 fn 这个手段消化利用,完成韦小宝前辈的壮举并返回return fn.apply(null, newArgs);};
};// 下为官员如何搞定7个老婆的测试
// 获得合法老婆
var getWife = currying(function() {var allWife = [].slice.call(arguments);// allwife 就是所有的老婆的,包括暗渡陈仓进来的老婆console.log(allWife.join(";"));
}, "合法老婆");// 获得其他6个老婆
getWife("大老婆","小老婆","俏老婆","刁蛮老婆","乖老婆","送上门老婆");// 换一批老婆
getWife("超越韦小宝的老婆");
- 小柯南,大柯南
var smallKenan = function(action) {var bigKenan = function(doing) {var result = "";if (action === "take drugs") {if (doing === "bathWithGirlFriend") {result = "尖叫,新一,你这个色狼,然后一巴掌,脸煮熟了~";} else if (doing === "pointOutKiller") {result = "新一,这个案子就交给你的,快点找出谁是凶手吧~";}} else {if (doing === "bathWithGirlFriend") {result = "来吧,柯南,一起洗澡吧~";} else if (doing === "pointOutKiller") {result = "小孩子家,滚一边去!";}}console.log(result);return arguments.callee; // 等同于return bigKenan};return bigKenan;
};// 小柯南吃药了,然后和毛利兰洗澡,凶案现场指证犯人;结果是……
smallKenan("take drugs")("bathWithGirlFriend")("pointOutKiller");
3.2. 柯里化例子2 =》 提前返回
上一小节惰性模式代码改一改就变成了柯里化,初始addEvent
的执行其实值实现了部分的应用(只有一次的if...else if...
判定),而剩余的参数应用都是其返回函数实现的,典型的柯里化。
看下面例子:
var addEvent = (function(){if (window.addEventListener) {return function(el, sType, fn, capture) {el.addEventListener(sType, function(e) {fn.call(el, e);}, (capture));};} else if (window.attachEvent) {return function(el, sType, fn, capture) {el.attachEvent("on" + sType, function(e) {fn.call(el, e);});};}
})();
3.3. 柯里化例子3 =》延迟计算
例如累加计算某种物品的数量或者重量,看下面例子:
var curryWeight = function(fn) {var _fishWeight = [];return function() {if (arguments.length === 0) {return fn.apply(null, _fishWeight);} else {_fishWeight = _fishWeight.concat([].slice.call(arguments));}}
};
var fishWeight = 0;
var addWeight = curryWeight(function() {var i=0; len = arguments.length;for (i; i<len; i+=1) {fishWeight += arguments[i];}
});addWeight(2.3);
addWeight(6.5);
addWeight(1.2);
addWeight(2.5);
addWeight(); // 这里才计算console.log(fishWeight); // 12.5
虽然延迟计算听上去很高级,但是,恕我愚钝,我想破了脑袋也没想出哪种情况非要柯里化延迟计算实现才能显著提高性能。能想到的好处就是参数个数随意,比方说:
addWeight(2.3, 6.5);
addWeight(1.2, 2.5);
4. 等待者模式
等待者模式用来解决那些不确定先后完成的异步逻辑的。通过对多个异步进程监听,来触发未来发生的动作。其监听的异步逻辑完成时才会自动执行成功回调函数, 当然有一个异步逻辑执行失败了,它便会执行失败回调函数
看定义都知道这是ES6的Promise
,多个异步监听就是Promise.all()
参考资料:
张容铭著 javascript设计模式 182-252页
JavaScript设计模式读书笔记(四)= 技巧型设计模式相关推荐
- Head First设计模式读书笔记四 简单工厂 工厂模式 抽象工厂模式
本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: 工厂模式 https://blog.csdn.net/u011109881/article/details/56541580 ...
- JavaScript设计模式读书笔记(一)= 创建型设计模式
全系列目录 JavaScript设计模式读书笔记(一)=> 创建型设计模式 JavaScript设计模式读书笔记(二)=> 结构型设计模式 JavaScript设计模式读书笔记(三)=&g ...
- 大话设计模式读书笔记
主题 概要 设计模式 大话设计模式读书笔记 编辑 时间 新建 20170423 序号 参考资料 1 大话设计模式 重新看了一遍设计模式,除了一些已经特别熟悉的模式,都自己敲了一遍代码,有些豁然开朗的感 ...
- 设计模式读书笔记-----工厂方法模式
一.问题 在前一章<设计模式读书笔记-----简单工厂模式>中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨.如 ...
- 《关键对话——注意观察,如何判断对话氛围是否安全》读书笔记(四)
<关键对话--注意观察,如何判断对话氛围是否安全>读书笔记(四) 在对话过程中,既要关注对话内容(即讨论的主题),也要观察对话气氛(即参与者的反应).越早意识到你和对方退出了对话机制,就越 ...
- 《编程之美》读书笔记(四): 卖书折扣问题的贪心解法
<编程之美>读书笔记(四):卖书折扣问题的贪心解法 每次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话, ...
- 3d游戏设计读书笔记四
3d游戏设计读书笔记四 一.基本操作演练[建议做] 下载 Fantasy Skybox FREE, 构建自己的游戏场景 a. 在AssetStore中搜索Fantasy Skybox FREE并下载. ...
- 设计模式---读书笔记
一.文章来由 按照惯例,来一个来由,这是<设计模式-可复用面向对象软件的基础>的读书笔记,整理给自己看的,整理的内容也会不断更新.大神轻喷~~如果不喜欢请留言说明原因再踩哦,谢谢,我也可以 ...
- JAVA设计模式第二讲:创建型设计模式
设计模式(design pattern)是对软件设计中普遍存在的各种问题,所提出的解决方案.本文以面试题作为切入点,介绍了设计模式的常见问题.我们需要掌握各种设计模式的原理.实现.设计意图和应用场景, ...
最新文章
- Error: EACCES: permission denied, symlink
- pandas.DataFrame.multiply()含义解释
- 让你用 Chrome 上网快到想哭:Vimium
- 手把手教你实现一个 JSON 解析器!
- 正方形个数(二维点哈希)
- 两个苹果手机如何同步数据_同步苹果手机和Windows的提醒事项
- Linux系统管理(8)——Ubuntu安装ssh服务 以及版本查看命令
- 3、plt.figure()和Axes类
- 跨5合并dnf无限连接服务器,不妨一试!跨5等跨区卡登陆卡黑屏解决办法分享
- 计算机一级题库ps视频,计算机一级Photoshop题库及答案
- 教你如何查看加密的QQ空间和加密的QQ相册
- HDU 6638 Snowy Smile 线段树+最大子段和
- 八种酒吧里最IN喝酒法PartyOK版
- 用命令卸载Win8 IE9/IE10/IE11浏览器
- 信息安全技术 个人信息安全工程指南
- python实战教程:7万网站用户行为大数据的分析
- 如何使用U盘储存4G以上的大文件,比如说镜像文件
- [羊城杯2020]easyphp --- 伪协议的使用时机,---python上传.htaccess的利用 -- preg_match绕过
- 深入理解计算机操作系统(五)
- kNN(k-Nearest Neighbours)原理详解
热门文章
- 吉林大学软件学院数据库系统原理复习
- class file has wrong version 55.0, should be 52.0
- 网易云音乐(netease-cloud-music)无法通过图标打开,只能用命令行开启
- epl2编程指南_epl幻想gw2回顾和gw3算法精选
- windows无法格式化u盘_2019 SD卡、U盘无法格式化怎么办的解决方法
- 用 Python + Appium 的方式自动化清理微信僵尸好友
- 耦合协调度指标如何分析?
- C/C++内存泄漏及检测
- golang1.15.6 版本 map 源码笔记
- 考研复试(控制工程专硕)及大学本科(物联网工程)知识点回顾(五)——其他重点内容