第一部分 面向对象的JavaScript 2
第1章 富有表现力的JavaScript 2
1.1 JavaScript的灵活性 2
1.2弱类型语言 5
1.3函数是一等对象 5
1.4对象的易变性 6
1.5继承 8
1.6 JavaScript中的设计模式 8
1.7小结 8
第2章 接口 10
2.1什么是接口 10
接口之利 10
接口之弊 11
2.2其他面向对象语言处理接口的方式 11
2.3在JavaScript中模仿接口 13
用注释描述接口 13
用属性检查模仿接口 14
用鸭式辨型模仿接口 16
2.4本书采用的接口实现方法 17
2.5 Interface类 17
Interface类的使用场合 18
Interface类的用法 19
示例:使用Interface类 19
2.6依赖于接口的设计模式 21
2.7小结 22
第3章 封装和信息隐藏 23
3.1信息隐藏原则 23
封装与信息隐藏 23
接口扮演的角色 24
3.2创建对象的基本模式 24
门户大开型对象 25
用命名规范区别私用成员 28
作用域、嵌套函数和闭包 29
用闭包实现私用成员 30
3.3更多高级对象创建模式 32
静态方法和属性 32
常量 35
单体和对象工厂 36
3.4封装之利 36
3.5封装之弊 37
3.6小结 37
第4章 继承 39
4.1为什么需要继承 39
4.2类式继承 39
原型链 40
extend函数 41
4.3原型式继承 43
对继承而来的成员的读和写的不对等性 44
clone函数 46
4.4类式继承和原型式继承的对比 47
4.5继承与封装 47
4.6掺元类 48
4.7示例:就地编辑 49
类式继承解决方案 50
原型式继承解决方案 53
掺元类解决方案 56
4.8继承的适用场合 59
4.9小结 60
第5章 单体模式 61
5.1单体的基本结构 61
5.2划分命名空间 62
5.3用作特定网页专用代码的包装器的单体 64
5.4拥有私用成员的单体 66
使用下划线表示法 66
使用闭包 67
两种技术的比较 69
5.5惰性实例化 70
5.6分支 73
5.7示例:用分支技术创建XHR对象 74
5.8单体模式的适用场合 76
5.9单体模式之利 77
5.10单体模式之弊 77
5.11小结 77
第6章 方法的链式调用 78
6.1调用链的结构 78
6.2设计一个支持方法链式调用的JavaScript库 81
6.3使用回调从支持链式调用的方法获取数据 83
6.4小结 84
第二部分 设计模式 86
第7章 工厂模式 86
7.1简单工厂 86
7.2工厂模式 89
7.3工厂模式的适用场合 91
动态实现 91
节省设置开销 91
用许多小型对象组成一个大对象 92
7.4示例:XHR工厂 92
专用型连接对象 94
在运行时选择连接对象 95
7.5示例:RSS阅读器 97
7.6工厂模式之利 100
7.7工厂模式之弊 100
7.8小结 100
第8章 桥接模式 101
8.1示例:事件监听器 1
8.2桥接模式的其他例子 102
8.3用桥接模式联结多个类 103
8.4示例:构建XHR连接队列 103
添加核心工具 103
添加观察者系统 105
开发队列的基本框架 106
实现队列 108
哪些地方用了桥接模式 112
8.5桥接模式的适用场合 113
8.6桥接模式之利 113
8.7桥接模式之弊 113
8.8小结 114
第9章 组合模式 115
9.1组合对象的结构 115
9.2使用组合模式 115
9.3示例:表单验证 116
汇合起来 121
向FormItem添加操作 121
向层次体系中添加类 121
添加更多操作 123
9.4示例:图片库 124
9.5组合模式之利 127
9.6组合模式之弊 127
9.7小结 127
第10章 门面模式 128
10.1一些你可能已经知道的门面元素 128
10.2 JavaScript库的门面性质 129
10.3用作便利方法的门面元素 129
10.4示例:设置HTML元素的样式 131
10.5示例:设计一个事件工具 132
10.6 实现门面模式的一般步骤 133
10.7门面模式的适用场合 134
10.8门面模式之利 134
10.9门面模式之弊 134
10.10小结 135
第11章 适配器模式 136
11.1适配器的特点 136
11.2适配原有实现 137
11.3示例:适配两个库 137
11.4示例:适配电子邮件API 139
用适配器包装Web邮件API 143
从fooMail转向dedMail 144
11.5适配器模式的适用场合 144
11.6适配器模式之利 145
11.7适配器模式之弊 145
11.8小结 145
第12章 装饰者模式 146
12.1装饰者的结构 146
接口在装饰者模式中的角色 149
装饰者模式与组合模式的比较 150
12.2装饰者修改其组件的方式 150
在方法之后添加行为 150
在方法之前添加行为 151
替换方法 152
添加新方法 153
12.3工厂的角色 156
12.4函数装饰者 158
12.5装饰者模式的适用场合 159
12.6示例:方法性能分析器 159
12.7装饰者模式之利 162
12.8装饰者模式之弊 163
12.9小结 163
第13章 享元模式 164
13.1享元的结构 164
13.2示例:汽车登记 164
内在状态和外在状态 165
用工厂进行实例化 166
封装在管理器中的外在状态 167
13.3管理外在状态 168
13.4示例:Web日历 168
把日期对象转化为享元 170
外在数据保存在哪里 171
13.5示例:工具提示对象 171
未经优化的Tooltip类 171
作为享元的Tooltip 173
13.6保存实例供以后重用 175
13.7享元模式的适用场合 177
13.8实现享元模式的一般步骤 177
13.9享元模式之利 178
13.10享元模式之弊 179
13.11小结 179
第14章 代理模式 180
14.1代理的结构 180
代理如何控制对本体的访问 180
虚拟代理、远程代理和保护代理 183
代理模式与装饰者模式的比较 184
14.2代理模式的适用场合 184
14.3示例:网页统计 184
14.4包装Web服务的通用模式 187
14.5示例:目录查找 189
14.6创建虚拟代理的通用模式 192
14.7代理模式之利 195
14.8代理模式之弊 195
14.9小结 196
第15章 观察者模式 197
15.1示例:报纸的投送 197
推与拉的比较 197
模式的实践 198
15.2构建观察者API 200
投送方法 200
订阅方法 201
退订方法 202
15.3现实生活中的观察者 202
15.4示例:动画 202
15.5事件监听器也是观察者 203
15.6观察者模式的适用场合 204
15.7观察者模式之利 205
15.8观察者模式之弊 205
15.9小结 205
第16章 命令模式 206
16.1命令的结构 206
用闭包创建命令对象 207
客户、调用者和接收者 208
在命令模式中使用接口 208
16.2命令对象的类型 209
16.3示例:菜单项 210
菜单组合对象 211
命令类 213
汇合起来 214
添加更多菜单项 215
16.4示例:取消操作和命令日志 216
使用命令日志实现不可逆操作的取消 220
用于崩溃恢复的命令日志 222
16.5命令模式的适用场合 222
16.6命令模式之利 223
16.7命令模式之弊 223
16.8小结 223
第17章 职责链模式 225
17.1职责链的结构 225
17.2传递请求 230
17.3在现有层次体系中实现职责链 233
17.4事件委托 234
17.5职责链模式的适用场合 234
17.6图片库的进一步讨论 235
用职责链提高组合对象的效率 236
为图片添加标签 237
17.7职责链模式之利 240
17.8职责链模式之弊 240
17.9小结 241
索引 242