内容简介
本书是JavaScript设计模式领域的经典著作,由资深前端工程师曾探精心编写。全书以JavaScript语言为基础,系统讲解了23种常见设计模式在JavaScript中的实现与应用,并深入探讨了函数式编程、面向对象编程、高阶函数等JavaScript核心特性与设计模式的结合。
书中不仅涵盖了传统的创建型、结构型和行为型设计模式,如单例模式、策略模式、代理模式、迭代器模式、发布-订阅模式等,还特别增加了JavaScript特有的设计模式,如惰性加载、柯里化、链式调用等。每个模式都配有完整的代码示例和实际开发场景分析,帮助读者理解模式背后的思想,并灵活运用于日常开发。
本书强调“开发实践”,摒弃了纯理论的抽象讲解,而是将设计模式与真实项目需求相结合,例如通过观察者模式实现事件系统、用策略模式优化表单验证、用命令模式封装撤销操作等。此外,作者还分享了在大型Web应用中如何合理使用设计模式来提升代码的可维护性、可扩展性和复用性,避免过度设计。
无论是对于希望提升JavaScript编程水平的初学者,还是寻求代码架构优化经验的中高级开发者,本书都是一本不可多得的实战指南。通过本书的学习,读者将能够深入理解设计模式的精髓,写出更优雅、更健壮的JavaScript代码。
目录
序
本书结构
目标读者
示例代码与勘误
学习模式的作用
模式在不同语言之间的区别
设计模式的适用性
分辨模式的关键是意图而不是结构
对JavaScript设计模式的误解
模式的发展
第一部分 基础知识
第 1 章 面向对象的JavaScript
1.1 动态类型语言和鸭子类型
1.2 多态
1.2.1 一段“多态”的JavaScript代码
1.2.2 对象的多态性
1.2.3 类型检查和多态
1.2.4 使用继承得到多态效果
1.2.5 JavaScript的多态
1.2.6 多态在面向对象程序设计中的作用
1.2.7 设计模式与多态
1.3 封装
1.3.1 封装数据
1.3.2 封装实现
1.3.3 封装类型
1.3.4 封装变化
1.4 原型模式和基于原型继承的JavaScript对象系统
1.4.1 使用克隆的原型模式
1.4.2 克隆是创建对象的手段
1.4.3 体验Io语言
1.4.4 原型编程范型的一些规则
1.4.5 JavaScript中的原型继承
1.4.6 原型继承的未来
1.4.6 小结
第 2 章 this、call和apply
2.1 this
2.1.1 this的指向
2.1.2 丢失的this
2.2 call和apply
2.2.1 call和apply的区别
2.2.2 call和apply的用途
第 3 章 闭包和高阶函数
3.1 闭包
3.1.1 变量的作用域
3.1.2 变量的生存周期
3.1.3 闭包的更多作用
3.1.4 闭包和面向对象设计
3.1.5 用闭包实现命令模式
3.1.6 闭包与内存管理
3.2 高阶函数
3.2.1 函数作为参数传递
3.2.2 函数作为返回值输出
3.2.3 高阶函数实现AOP
3.2.4 高阶函数的其他应用
3.3 小结
第二部分 设计模式
第 4 章 单例模式
4.1 实现单例模式
4.2 透明的单例模式
4.3 用代理实现单例模式
4.4 JavaScript中的单例模式
4.5 惰性单例
4.6 通用的惰性单例
4.7 小结
第 5 章 策略模式
5.1 使用策略模式计算奖金
5.2 JavaScript版本的策略模式
5.3 多态在策略模式中的体现
5.4 使用策略模式实现缓动动画
5.4.1 实现动画效果的原理
5.4.2 思路和一些准备工作
5.4.3 让小球运动起来
5.5 更广义的“算法”
5.6 表单校验
5.6.1 表单校验的第一个版本
5.6.2 用策略模式重构表单校验
5.6.3 给某个文本输入框添加多种校验规则
5.7 策略模式的优缺点
5.8 一等函数对象与策略模式
5.9 小结
第 6 章 代理模式
6.1 第一个例子——小明追MM的故事
6.2 保护代理和虚拟代理
6.3 虚拟代理实现图片预加载
6.4 代理的意义
6.5 代理和本体接口的一致性
6.6 虚拟代理合并HTTP请求
6.7 虚拟代理在惰性加载中的应用
6.8 缓存代理
6.8.1 缓存代理的例子——计算乘积
6.8.2 缓存代理用于ajax异步请求数据
6.9 用高阶函数动态创建代理
6.10 其他代理模式
6.11 小结
第 7 章 迭代器模式
7.1 jQuery中的迭代器
7.2 实现自己的迭代器
7.3 内部迭代器和外部迭代器
7.4 迭代类数组对象和字面量对象
7.5 倒序迭代器
7.6 中止迭代器
7.7 迭代器模式的应用举例
7.8 小结
第 8 章 发布—订阅模式
8.1 现实中的发布-订阅模式
8.2 发布-订阅模式的作用
8.3 DOM事件
8.4 自定义事件
8.5 发布-订阅模式的通用实现
8.6 取消订阅的事件
8.7 真实的例子——网站登录
8.8 全局的发布-订阅对象
8.9 模块间通信
8.10 必须先订阅再发布吗
8.11 全局事件的命名冲突
8.12 JavaScript实现发布-订阅模式的便利性
8.13 小结
第 9 章 命令模式
9.1 命令模式的用途
9.2 命令模式的例子——菜单程序
9.3 JavaScript中的命令模式
9.4 撤销命令
9.5 撤消和重做
9.6 命令队列
9.7 宏命令
9.8 智能命令与傻瓜命令
9.9 小结
第 10 章 组合模式
10.1 回顾宏命令
10.2 组合模式的用途
10.3 请求在树中传递的过程
10.4 更强大的宏命令
10.5 抽象类在组合模式中的作用
10.6 透明性带来的安全问题
10.7 组合模式的例子——扫描文件夹
10.8 一些值得注意的地方
10.9 引用父对象
10.10 何时使用组合模式
10.11 小结
第 11 章 模板方法模式
11.1 模板方法模式的定义和组成
11.2 第一个例子——Coffee or Tea
11.2.1 先泡一杯咖啡
11.2.2 泡一壶茶
11.2.3 分离出共同点
11.2.4 创建Coffee子类和Tea子类
11.3 抽象类
11.3.1 抽象类的作用
11.3.2 抽象方法和具体方法
11.3.3 用Java实现Coffee or Tea的例子
11.3.4 JavaScript没有抽象类的缺点和解决方案
11.4 模板方法模式的使用场景
11.5 钩子方法
11.6 好莱坞原则
11.7 真的需要“继承”吗
11.8 小结
第 12 章 享元模式
12.1 初识享元模式
12.2 内部状态与外部状态
12.3 享元模式的通用结构
12.4 文件上传的例子
12.4.1 对象爆炸
12.4.2 享元模式重构文件上传
12.4.3 剥离外部状态
12.4.4 工厂进行对象实例化
12.4.5 管理器封装外部状态
12.5 享元模式的适用性
12.6 再谈内部状态和外部状态
12.6.1 没有内部状态的享元
12.6.2 没有外部状态的享元
12.7 对象池
12.7.1 对象池实现
12.7.2 通用对象池实现
12.8 小结
第 13 章 职责链模式
13.1 现实中的职责链模式
13.2 实际开发中的职责链模式
13.3 用职责链模式重构代码
13.4 灵活可拆分的职责链节点
13.5 异步的职责链
13.6 职责链模式的优缺点
13.7 用AOP实现职责链
13.8 用职责链模式获取文件上传对象
13.9 小结
第 14 章 中介者模式
14.1 现实中的中介者
14.2 中介者模式的例子——泡泡堂游戏
14.2.1 为游戏增加队伍
14.2.2 玩家增多带来的困扰
14.2.3 用中介者模式改造泡泡堂游戏
14.3 中介者模式的例子——购买商品
14.3.1 开始编写代码
14.3.2 对象之间的联系
14.3.3 可能遇到的困难
14.3.4 引入中介者
14.4 小结
第 15 章 装饰者模式
15.1 模拟传统面向对象语言的装饰者模式
15.2 装饰者也是包装器
15.3 回到JavaScript的装饰者
15.4 装饰函数
15.5 用AOP装饰函数
15.6 AOP的应用实例
15.6.1 数据统计上报
15.6.2 用AOP动态改变函数的参数
15.6.3 插件式的表单验证
15.7 装饰者模式和代理模式
15.8 小结
第 16 章 状态模式
16.1 初识状态模式
16.1.1 第一个例子:电灯程序
16.1.2 状态模式改进电灯程序
16.2 状态模式的定义
16.3 状态模式的通用结构
16.4 缺少抽象类的变通方式
16.5 另一个状态模式示例——文件上传
16.5.1 更复杂的切换条件
16.5.2 一些准备工作
16.5.3 开始编写代码
16.5.4 状态模式重构文件上传程序
16.6 状态模式的优缺点
16.7 状态模式中的性能优化点
16.8 状态模式和策略模式的关系
16.9 JavaScript版本的状态机
16.10 表驱动的有限状态机
16.11 实际项目中的其他状态机
16.12 小结
第 17 章 适配器模式
17.1 现实中的适配器
17.2 适配器模式的应用
17.3 小结
第三部分 设计原则和编程技巧
第 18 章 单一职责原则
18.1 设计模式中的SRP原则
18.2 何时应该分离职责
18.3 违反SRP原则
18.4 SRP原则的优缺点
第 19 章 最少知识原则
19.1 减少对象之间的联系
19.2 设计模式中的最少知识原则
19.3 封装在最少知识原则中的体现
第 20 章 开放-封闭原则
20.1 扩展window.onload函数
20.2 开放和封闭
20.3 用对象的多态性消除条件分支
20.4 找出变化的地方
20.5 设计模式中的开放-封闭原则
20.6 开放-封闭原则的相对性
20.7 接受第一次愚弄
第 21 章 接口和面向接口编程
21.1 回到Java的抽象类
21.2 interface
21.3 JavaScript语言是否需要抽象类和interface
21.4 用鸭子类型进行接口检查
21.5 用TypeScript编写基于interface的命令模式
第 22 章 代码重构
22.1 提炼函数
22.2 合并重复的条件片段
22.3 把条件分支语句提炼成函数
22.4 合理使用循环
22.5 提前让函数退出代替嵌套条件分支
22.6 传递对象参数代替过长的参数列表
22.7 尽量减少参数数量
22.8 少用三目运算符
22.9 合理使用链式调用
22.10 分解大型类
22.11 用return退出多重循环
参考文献
您当前的等级为
登录后免费下载登录
小黑屋反思中,不准下载!
评论后刷新页面下载评论
支付¥以后下载
请先登录
您今天的下载次数(次)用完了,请明天再来
支付积分以后下载立即支付
支付以后下载立即支付
您当前的用户组不允许下载升级会员
您已获得下载权限
您可以每天下载资源次,今日剩余次
免责申明:
1. 本站分享的所有书籍均来源于自互联网,我们只进行收集整理,并不对书籍内容进行更改。
2. 部分书籍中可能有书籍压制者放置的广告,这并不是本站所为,请注意甄别。
3. 我们分享这些书籍,纯粹是出于知识分享的热情,以及对互联网分享精神的高度认同和践行,不以盈利为目的。
4. 本站分享的所有书籍,仅供个人学习研究使用,请勿用于任何商业用途,否则产生的一切法律纠纷与本站无关。
5. 如果这些书籍让你有所收获,在条件允许的情况下,请一定购买正版书籍,这是对创作者最好的支持。
6. 如果您是此书籍的版权所有者,且您不希望此作品出现在本站,请联系我们,我们将在收到您的请求后48小时内予以删除。