图书介绍
JavaScript王者归来pdf电子书版本下载
- 月影著 著
- 出版社: 北京:清华大学出版社
- ISBN:9787302173083
- 出版时间:2008
- 标注页数:712页
- 文件大小:139MB
- 文件页数:752页
- 主题词:JAVA语言-程序设计
PDF下载
下载说明
JavaScript王者归来PDF格式电子书版下载
下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如 BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!
(文件页数 要大于 标注页数,上中下等多册电子书除外)
注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具
图书目录
第一部分 概论 1
第1章 从零开始 1
1.1 为什么选择JavaScript? 1
1.1.1 用户的偏好——B/S模式 1
1.1.2 在什么情况下用JavaScript 2
1.1.3 对JavaScript的一些误解 3
1.1.3.1 JavaScript和Java的关系 3
1.1.3.2 披着C外衣的Lisp 3
1.1.3.3 关于JavaScript的思维定势 3
1.1.3.4 JavaScript是为业余爱好者设计的? 4
1.1.3.5 JavaScript是面向对象的吗 4
1.1.3.6 其他误解 4
1.1.4 警惕!脚本诱惑 5
1.1.5 隐藏在简单表象下的复杂度 5
1.1.6 令人迷惑的选择——锦上添花还是雪中送炭 6
1.1.7 回到问题上来 7
1.2 JavaScript的应用范围 7
1.2.1 客户端的JavaScript 7
1.2.2 服务器端的JavaScript 9
1.2.3 其他环境中的JavaScript 9
1.3 JavaScript的版本 10
1.3.1 浏览器中的JavaScript版本 10
1.3.2 其他版本 10
1.4 一些值得留意的特性 11
1.4.1 小把戏——神奇的魔法代码 11
1.4.2 为客户端服务——经典Hello World!的另一种JavaScript实现 14
1.4.3 数据交互——JavaScript的一项强大功能 16
1.4.4 JavaScript表面上的禁忌及如何突破这些禁忌 17
1.5 安全性和执行效率 19
1.5.1 数据安全——永远的敏感话题 20
1.5.2 实战!攻击与防范 20
1.5.3 不容马虎——时刻关注性能 24
1.6 一个例子——JavaScript编写的计算器 26
1.6.1 从需求分析开始——什么是计算器? 26
1.6.2 系统设计——如何实现计算器? 27
1.6.3 系统实现——计算器的最终实现 32
1.6.4 持续改进——迭代的软件开发过程 42
1.7 学习和使用JavaScript的几点建议 44
1.7.1 像程序员一样地思考——程序员的四个境界 44
1.7.2 吝惜你的代码 47
1.7.3 学会在环境中调试 47
1.7.4 警惕那些小缺陷 47
1.7.5 思考先于实践——不要轻易动手写代码 48
1.7.6 时刻回头——圣贤也无法完全预知未来 48
1.8 关于本书的其余部分 49
第2章 浏览器中的JavaScript 50
2.1 嵌入网页的可执行内容 50
2.1.1 在什么地方装载JavaScript代码 50
2.1.2 关于代码的Script标签 52
2.1.3 我的代码什么时候被执行——不同执行期的JavaScript代码 52
2.1.4 拿来主义——引入外部的JavaScript文件 54
2.2 赏心悦目的特效 58
2.2.1 生命在于运动——DHTML的效果 58
2.2.2 换一种风格——CSS的力量 59
2.2.3 用JavaScript操作DOM——一个可拖动窗口的例子 60
2.3 使用JavaScript来与用户交互 62
2.3.1 创建一个弹出式帮助和进度条 62
2.3.2 填错了哦 66
2.4 绕开脚本陷阱 66
2.4.1 现实并不总是完美的 67
2.4.2 不能完全相信你所见到的 67
2.5 总结 68
第3章 开发环境和调试方法 69
3.1 我能用什么来编写脚本——适合编写JavaScript的文本编辑器 69
3.2 来自浏览器的支持 72
3.2.1 主流浏览器 72
3.2.2 非主流浏览器 73
3.3 集成开发环境 73
3.3.1 什么是集成开发环境 73
3.3.2 我需要集成开发环境吗 73
3.3.3 适合JavaScript的集成开发环境 74
3.4 调试工具——提升开发效率的利器 75
3.4.1 什么是调试 75
3.4.2 原始的调试方法——利用输出语句、“反射”机制和调试对象来进行调试 75
3.4.3 适合JavaScript的调试工具 77
3.5 定位代码和调用堆栈 79
3.5.1 Step by Step——单步和断点 79
3.5.2 监视内存 80
3.5.3 追踪问题的源头——查看调用堆栈 81
3.5.4 遇到麻烦了——为什么我跟踪不到代码 82
3.6 浏览器捕获异常 82
3.6.1 异常处理机制——一个try/catch/finally模式的例子 82
3.6.2 异常的种类 84
3.6.3 应该在什么时候“吃掉”异常 85
3.7 总结 86
第二部分 JavaScript核心 87
第4章 语言结构 87
4.1 JavaScript的基本文法 87
4.1.1 字符集 87
4.1.2 大小写敏感 89
4.1.3 分隔符 89
4.1.4 词、句子和段落 90
4.1.5 分号 91
4.1.6 标记 92
4.1.7 注释 92
4.1.8 保留字 92
4.2 常量和变量 93
4.2.1 常量和变量 93
4.2.2 变量的标识符 94
4.2.3 变量的类型 94
4.2.4 变量的声明 94
4.2.5 变量的作用域 96
4.3 表达式和运算符 99
4.3.1 表达式 100
4.3.2 运算符概述 100
4.3.3 算术运算符 101
4.3.4 关系运算符 103
4.3.5 逻辑运算符 105
4.3.6 位运算符 107
4.3.7 赋值运算符 108
4.3.8 其他运算符 109
4.3.8.1 条件运算符 109
4.3.8.2 逗号运算符 109
4.3.8.3 对象运算符 110
4.3.8.4 类型运算符 113
4.3.8.5 void运算符 113
4.3.8.6 函数调用运算符 114
4.4 控制语句 114
4.4.1 表达式语句 114
4.4.2 语句块 114
4.4.3 条件语句 115
4.4.4 循环语句 120
4.4.5 跳转语句 123
4.4.6 异常处理语句 125
4.4.7 其他语句 127
4.4.7.1 var语句 127
4.4.7.2 function语句 127
4.4.7.3 with语句 128
4.4.7.4 空语句 128
4.5 总结 129
第5章 数据类型 130
5.1 基本数据类型 130
5.1.1 数值 130
5.1.2 字符串——一个字符串相关操作的例子 132
5.1.3 布尔型 134
5.2 数组和对象 135
5.2.1 数组 135
5.2.2 对象——一个构造函数的例子 136
5.3 函数类型——一个函数和闭包的例子 140
5.4 神奇的null和undefined 142
5.4.1 null 142
5.4.2 undefined——独一无二的类型 142
5.5 正则表达式 143
5.5.1 正则表达式常量 143
5.5.2 正则表达式对象 143
5.6 值类型和引用类型 143
5.6.1 什么是值和值的引用 144
5.6.2 使用值和使用引用 145
5.6.3 值与引用的相互转换:装箱和拆箱 147
5.7 类型识别与类型转换 148
5.7.1 运行时类型识别——两个运行的类型识别的例子 148
5.7.2 类型的自动转换及其例子 150
5.7.3 强制类型转换及其例子 151
5.7.4 高级用法——一个自定义类型转换的例子 154
5.8 警惕数值陷阱 156
5.8.1 困惑——浮点数的精度问题 156
5.8.2 误差的修正及其例子 156
5.9 总结 158
第6章 函数 159
6.1 函数定义和函数调用 159
6.1.1 函数的定义 159
6.1.1.1 声明式函数定义与函数表达式及其例子 159
6.1.1.2 JavaScript函数的奥妙——魔法代码 161
6.1.2 函数的调用 163
6.2 函数的参数 164
6.2.1 形参与实参 164
6.2.2 Arguments对象 166
6.2.2.1 一个使用Arguments对象检测形参的例子 166
6.2.2.2 一个使用Arguments对象接收任意个数参数的例子 167
6.2.2.3 一个使用Arguments对象模拟函数重载的例子 168
6.2.3 参数类型匹配——一个利用arguments实现函数重载机制的例子 170
6.3 函数的调用者和所有者 173
6.3.1 函数的调用者 173
6.3.2 函数的所有者——一个为函数指定所有者的例子 174
6.3.3 动态调用——外来的所有者 176
6.4 函数常量和闭包 177
6.4.1 匿名的函数 178
6.4.2 函数引用 178
6.4.3 函数参数和函数返回值及其例子 179
6.4.4 高级用法——闭包作为局部域与延迟求值 181
6.5 高级抽象——Function类型和函数模版 182
6.5.1 动态创建函数——一个利用Function实现Lambda算子的例子 182
6.5.2 模式——函数工厂及其实例 183
6.6 总结 187
第7章 对象 188
7.1 什么是对象 188
7.2 对象的属性和方法 188
7.2.1 对象的内置属性 188
7.2.2 为对象添加和删除属性 191
7.2.3 反射机制——枚举对象属性 193
7.3 对象的构造 193
7.3.1 构造函数——一个双精度浮点数封装类的例子 193
7.3.2 缺省构造和拷贝构造 196
7.3.3 对象常量 197
7.4 对象的销毁和存储单元的回收 197
7.5 JavaScript的内置对象 198
7.5.1 Math对象 198
7.5.2 Date对象——创建一个简单的日历 199
7.5.3 Error对象 202
7.5.4 其他内置对象 202
7.5.5 特殊的对象——全局对象与调用对象 203
7.6 总结 203
第8章 集合 205
8.1 数组和数组元素 205
8.1.1 数组的构造 205
8.1.2 数组常量 206
8.1.3 数组元素 206
8.2 数组对象和方法 207
8.2.1 查找元素 207
8.2.2 添加和删除元素 207
8.2.3 集合操作及其范例 208
8.2.3.1 join()方法 208
8.2.3.2 reverse()方法 209
8.2.3.3 sort()方法 209
8.2.3.4 concat()方法 209
8.2.3.5 slice()方法 209
8.2.3.6 splice()方法 210
8.2.3.7 toSgring()方法和toLocaleString()方法 210
8.3 哈希表 211
8.3.1 什么是哈希表 211
8.3.2 哈希表的构造 211
8.3.3 实现一个简单的HashTable类型 212
8.4 高级用法——集合操作和闭包 214
8.5 总结 219
第9章 字符串 220
9.1 字符串的构造 220
9.1.1 字符串常量 220
9.1.2 转义序列 220
9.1.3 字符串构造函数 221
9.2 字符串的使用 221
9.2.1 比较字符串 221
9.2.2 抽取和检索子串 222
9.2.3 连接拆分字符串 222
9.2.4 字符串的模式匹配——一个字符串格式校验的例子 223
9.2.5 其他方法 225
9.3 字符串与字符数组 225
9.4 字符串与文本处理——JavaScript棋谱阅读器(一) 226
9.4.1 需求分析——什么是棋谱和棋谱阅读器 226
9.4.2 系统设计——棋谱和棋盘数据的字符串描述 228
9.4.3 系统实现——解析和处理棋谱 229
9.4.4 完整的棋谱阅读器 231
9.5 总结 231
第10章 正则表达式 232
10.1 什么是正则表达式 232
10.1.1 正则表达式的概念 232
10.1.2 JavaScript中的正则表达式 232
10.2 正则表达式的规则 233
10.2.1 直接量字符 233
10.2.2 字符类和布尔操作 234
10.2.3 重复 234
10.2.4 选择、分组和引用 235
10.2.5 指定匹配的位置 235
10.2.6 标志——高级模式匹配的规则 236
10.3 模式匹配 236
10.3.1 用于模式匹配的String方法及其例子 236
10.3.2 用于模式匹配的RegExp方法 240
10.3.2.1 一个使用exec()方法从身份证号码获取生日的例子 240
10.3.2.2 一个使用test()方法遍历字符串的例子 241
10.4 关于正则表达式包装对象 242
10.4.1 RegExp对象——利用正则表达式实现全文检索 242
10.4.2 RegExp的实例属性 244
10.5 强大的正则表达式 244
10.5.1 分析正则表达式的局部 244
10.5.2 一个例子——强大的在线编辑器 245
10.5.3 构造新的文法——一个在JSVM中实现JSVM2解析器的例子 247
10.6 高级用法 250
10.7 用正则表达式处理文本 251
10.7.1 创建一个计价公式编辑器 251
10.7.1.1 需求分析——什么是计价公式编辑器 251
10.7.1.2 系统实现——计价公式编辑器的实现 251
10.7.2 创建一个同步滚动歌词播放器 255
10.7.2.1 需求分析——什么是同步滚动歌词播放器 255
10.7.2.2 系统设计与实现——处理LRC歌词 256
10.8 总结 260
第三部分 浏览器与DOM 261
第11章 浏览器对象 261
11.1 Window对象——最基本的浏览器对象 261
11.1.1 Window对象概览 261
11.1.2 Window对象的生命周期 262
11.1.3 Window对象的属性和方法 264
11.1.4 一个多窗口应用的例子 266
11.2 Document对象——浏览器窗口文档内容的代表 267
11.2.1 Document对象概览 267
11.2.2 动态生成的文档 267
11.2.3 Document对象的基本信息 270
11.2.4 Document对象的外观属性 272
11.2.5 Document子对象接口 273
11.2.5.1 一个遍历Anchors对象的例子 274
11.2.5.2 一个颠倒图片的例子 274
11.3 对话框和状态栏 276
11.3.1 创建一个简单对话框 276
11.3.2 其他类型的对话框 277
11.3.2.1 模拟对话框——创建一个窗口对话框及一个对话框阻塞进行的例子 277
11.3.2.2 showModalDialog和showModelessDialog——非W3C或ECMAScrip标准 281
11.3.3 状态栏 287
11.4 框架——上层的Window对象 288
11.4.1 多框架应用 288
11.4.2 框架之间的关系 289
11.4.3 框架的命名 289
11.4.4 子框架中的JavaScript 290
11.4.5 框架的应用——多页签显示 290
11.4.5.1 什么是页签 291
11.4.5.2 页签的实现——创建一个包含页签的页面 291
11.5 表单和表单对象 293
11.5.1 Form对象及其范例 293
11.5.2 定义表单元素 296
11.5.3 客户端表单校验及其例子 297
11.5.4 创建一款通用的客户端表单校验组件 301
11.6 其他内置对象 311
11.6.1 Navigator对象——浏览器总体信息的代表 311
11.6.2 Screen对象——提供显示器分辨率和可用颜色数量信息 312
11.6.3 Location对象——当前窗口中显示文档的URL的代表 314
11.6.4 History对象——一个有趣的对象 316
11.7 总结 316
第12章 文档对象模型 317
12.1 什么是DOM 317
12.1.1 把文档表示为树 318
12.1.2 树的节点 318
12.1.3 DOM对象的通用属性和方法 319
12.1.4 HTML结构和DOM对象的关系——用JavaScript通过DOM来操作HTML文档 319
12.2 DOM与浏览器实现 322
12.2.1 关于DOM HTML API 322
12.2.2 DOM的级别和特性 325
12.2.3 DOM的一致性 325
12.2.4 差异性——浏览器的DOM方言 326
12.3 一组“盒子”——DOM元素 326
12.3.1 嵌套的“盒子” 326
12.3.2 “盒子”和“盒子”内容的分类 327
12.4 创建和删除节点 328
12.4.1 构造全新的节点 328
12.4.2 平面展开——通过文档元素直接创建 330
12.4.3 回收空间——删除不用的节点 333
12.5 访问和操纵DOM节点 333
12.5.1 打开每一个盒子——遍历节点 333
12.5.2 弄清层级关系——父子与兄弟 334
12.5.3 如何搜索特定节点 335
12.5.4 克隆节点——一个使用cloneNode()复制表格的例子 339
12.5.5 移动节点及其范例 341
12.5.6 关于添加新行和排序的小技巧 344
12.6 读写数据——添加、修改和删除属性 347
12.7 外观与行为 348
12.7.1 DOM样式属性 348
12.7.2 控制DOM元素的显示与隐藏 348
12.7.3 改变颜色和大小——一个简单有趣的例子 350
12.7.4 改变位置——创建一个绕圆圈旋转的文字 351
12.7.5 编辑控制及其范例 352
12.7.6 改变样式及其范例 354
12.7.7 改变行为 355
12.8 XML DOM 356
12.8.1 什么是XML DOM 356
12.8.2 如何使用XML DOM——一个利用XML实现多级关联下拉选择框的例子 356
12.9 总结 359
第13章 事件处理 360
13.1 什么是事件 360
13.1.1 消息与事件响应 360
13.1.2 浏览器的事件驱动机制 362
13.2 基本事件处理 362
13.2.1 事件和事件类型 362
13.2.2 事件的绑定 363
13.2.3 直接调用事件处理函数 364
13.2.4 事件处理函数的返回值 365
13.2.5 带参数的事件响应及其例子 366
13.2.6 “this”关键字 367
13.3 标准事件模型 367
13.3.1 起泡和捕捉——浏览器的事件传播 368
13.3.2 事件处理函数的注册 369
13.3.3 把对象注册为事件处理程序 369
13.3.4 事件模块和事件类型 370
13.3.5 关于Event接口 371
13.3.5.1 Event接口的属性和方法 372
13.3.5.2 UIEvent接口的属性 373
13.3.5.3 MouseEvent接口的属性 373
13.3.5.4 MutationEvent接口 373
13.3.6 混合事件模型 373
13.3.7 合成事件 374
13.4 浏览器的事件处理模型实现 374
13.4.1 Internet Explorer事件模型 374
13.4.1.1 关于IE事件注册 374
13.4.1.2 IE Event对象的属性 376
13.4.1.3 IE中的事件起泡 376
13.4.2 Netscape 4事件模型 376
13.4.2.1 Netscape 4中的事件捕捉及其范例 376
13.4.2.2 Netscape 4 Event对象的属性 380
13.5 回调与用户自定义事件 381
13.5.1 事件处理模式——一个实现简单事件处理模式的例子 381
13.5.2 用户事件接口的定义 383
13.5.3 事件代理和事件注册——一个实现标准事件接口的例子 384
13.5.4 标准模式——事件分派和接收 388
13.6 一个例子——增强数据表格 391
13.6.1 什么是增强数据表格 391
13.6.2 一个采用两重table嵌套方式固定表头的例子 391
13.6.3 可变列宽的实现 394
13.6.4 标记行——呈现有别于其他行的背景色 396
13.6.5 小技巧——将代码添加到样式表 397
13.7 总结 399
第14章 级联样式表 400
14.1 什么是级联样式表 400
14.1.1 CSS样式和样式表 400
14.1.2 CSS的标准化 400
14.1.3 浏览器支持的CSS 403
14.2 JavaScript与CSS 404
14.2.1 CSS和DOM的关系 404
14.2.2 CSS和IE的关系 406
14.2.3 浏览器的CSS兼容性 407
14.3 控制CSS改变页面风格 407
14.3.1 实现结构与表现的分离及其范例 407
14.3.2 使用JwaScript和CSS实现页面多种风格的实时替换 413
14.4 总结 416
第15章 数据存储的脚本化 417
15.1 什么是cookie 417
15.1.1 浏览器和客户端cookie 417
15.1.2 cookie的属性 418
15.2 cookie的客户端存取 418
15.2.1 cookie的存储 418
15.2.2 cookie的读取 419
15.3 cookie的限制 419
15.4 cookie示例——让问候更加温暖 419
15.5 cookie对象的封装 423
15.6 什么是userData 425
15.6.1 浏览器和客户端userData 425
15.6.2 userData的声明 425
15.6.3 userData的属性和方法 425
15.7 userData的客户端存取 426
15.7.1 userData的存储和读取 426
15.7.2 userData的安全性 427
15.8 userData的限制 427
15.9 userData与cookie的对比 427
15.10 userData示例——一个利用userData实现客户端保存表单数据的例子 427
15.11 总结 432
第四部分 数据交互 433
第16章 同步和异步 433
16.1 什么是同步和异步 433
16.2 超时设定和时间间隔 434
16.3 定时器使用——侦听与拦截 435
16.3.1 标准模式——监视器及其范例 436
16.3.2 使用定时器时应当注意的问题 437
16.4 一个例子——漂亮的Web时钟 439
16.4.1 什么是Web时钟? 439
16.4.2 最简单的Web时钟 439
16.4.3 Web时钟的设计 440
16.4.4 完整的Web时钟源代码 440
16.5 总结 445
第17章 XML DOM和XML HTTP 446
17.1 什么是XML DOM对象 446
17.1.1 XML DOM简介 446
17.1.2 浏览器支持的XML DOM接口 447
17.1.2.1 XML DOM标准接口 447
17.1.2.2 IE的XML DOM组件 448
17.1.2.3 操作XML文档——一个使用MSXML操作XML文档的例子 450
17.2 XML DOM的版本兼容性——XML DOM的跨浏览器应用 452
17.3 XML DOM的错误处理 457
17.3.1 处理错误信息的ParseError对象 457
17.3.2 包含错误信息的文档 458
17.4 XML DOM操作XML文档 458
17.4.1 访问节点 458
17.4.2 创建新节点 459
17.4.3 移动和修改节点及其范例 460
17.4.4 读写节点属性和读写数据 462
17.4.5 保存文档 462
17.5 一个例子——JavaScript棋谱阅读器(二) 462
17.5.1 用XML描述棋谱 462
17.5.2 将XML棋谱转换为SGF棋谱 463
17.6 什么是XML HTTP对象 464
17.6.1 XML HTTP对象简介 465
17.6.2 浏览器支持的XML HTTP对象 465
17.7 通过XML HTTP发送请求 465
17.7.1 建立连接 466
17.7.2 发送请求 466
17.8 读取和设定HTTP头 466
17.8.1 什么是HTTP头 466
17.8.2 读取和设定HTTP头 467
17.9 服务器应答 467
17.9.1 同步和异步应答及其例子 468
17.9.2 包含应答文本内容的ResponseText和ResponseXML 469
17.10 总结 470
第18章 Ajax简介 471
18.1 什么是Ajax 471
18.1.1 Ajax并不神秘 471
18.1.2 Ajax的应用场景 471
18.1.3 Ajax的竞争对手——其他替代技术 472
18.2 Ajax初探——我的第一个Ajax程序 473
18.2.1 从常规应用开始——一个简单的实时聊天室 473
18.2.2 讨厌的页面刷新 475
18.2.3 无刷新解决方案——改进的聊天室 475
18.2.4 异步工作——迟滞感的解决方案 476
18.3 Ajax原理剖析 478
18.3.1 XML HTTP实时通信及一个简单封装了AjaxProxy对象的例子 478
18.3.2 数据动态显示——Ajax改善交互体验的重要特点 481
18.3.3 发挥XML的能力 484
18.3.4 用JavaScript绑定一切 484
18.3.5 应用背后的标准 484
18.4 Ajax范例——实时聊天工具 485
18.4.1 什么是实时聊天工具 485
18.4.2 需求分析——实时聊天功能的实现要点 486
18.4.3 系统实现——实时聊天功能的实现 486
18.4.4 小结 487
18.5 总结 488
第19章 标准和兼容性 489
19.1 标准化组织 489
19.1.1 W3C和DOM标准 489
19.1.2 ECMA和JavaScript标准 489
19.1.3 互联网标准 490
19.2 平台和浏览器的兼容性 490
19.2.1 最小公分母法 490
19.2.2 防御性编码 490
19.2.3 客户端探测器 491
19.2.4 特性检测 491
19.2.5 实现标准 491
19.2.6 适度停止运行 492
19.3 语言版本的兼容性 492
19.3.1 language属性 492
19.3.2 版本测试 492
19.4 如何实现跨浏览器应用 493
19.4.1 取舍——划定支持范围 493
19.4.2 基础模块设计——独立兼容性检测 494
19.4.3 划分运行级别 495
19.4.4 给出正确的信息——不要让你的代码保持沉默 496
19.4.5 充分的应用测试——“兼容性魔鬼”总会趁你不注意时“踢你的狗” 497
19.4.6 靠近标准和就近原则 497
19.5 展望未来 498
19.6 总结 498
第20章 信息安全 499
20.1 用户的隐私信息 499
20.2 禁止和受限制的操作 500
20.2.1 受限制的属性 500
20.2.2 受限制的操作 501
20.2.3 脚本安全级别 501
20.2.4 脚本调试 502
20.3 警惕幕后的攻击者 503
20.3.1 攻击的手段 503
20.3.2 隐匿的数据流 504
20.3.3 页面伪装 504
20.3.4 发现蛛丝马迹 504
20.3.5 防范的手段 505
20.3.5.1 传输数据的加密 505
20.3.5.2 对用户隐藏源代码 506
20.4 同源策略 507
20.4.1 什么是同源策略 507
20.4.2 同源策略的利弊 508
20.4.3 突破同源策略 508
20.5 安全区和签名脚本 508
20.5.1 可配置的安全策略方案 508
20.5.2 Internet Explorer的安全区 509
20.5.3 Netscape的签名脚本 509
20.6 代码本身的安全——加密和混淆 509
20.6.1 为什么要加密和混淆 509
20.6.2 客户端的加密技术及其例子 509
20.6.3 代码混淆原理 510
20.6.4 JavaScript代码混淆工具——一个代码混淆算法的例子 511
20.6.5 加密和混淆的结合使用 515
20.7 总结 516
第五部分 超越JavaScript 517
第21章 面向对象 517
21.1 什么面向对象 517
21.1.1 类和对象 518
21.1.2 公有和私有——属性的封装 519
21.1.3 属性和方法的类型 521
21.2 神奇的prototype 522
21.2.1 什么是prototype 523
21.2.2 prototype的使用技巧 525
21.2.2.1 给原型对象添加属性 525
21.2.2.2 带默认值的Point对象 526
21.2.2.3 delete操作将对象属性恢复为默认值 527
21.2.2.4 使用prototype巧设getter 529
21.2.2.5 delete操作恢复原型属性的可见性 530
21.2.2.6 使用prototype创建大量副本 533
21.2.2.7 使用prototype定义静态方法 533
21.2.3 prototype的实质及其范例 534
21.2.4 prototype的价值与局限性 535
21.3 继承与多态 537
21.3.1 什么是继承 537
21.3.2 实现继承的方法 538
21.3.2.1 构造继承法及其例子 538
21.3.2.2 原型继承法及其例子 541
21.3.2.3 实例继承法及其例子 544
21.3.2.4 拷贝继承法及其例子 546
21.3.2.5 几种继承法的比较 547
21.3.2.6 混合继承法及其例子 547
21.3.3 单继承与多重继承 548
21.3.4 接口及其实现 549
21.3.5 多态及其实现 551
21.4 构造与析构 553
21.4.1 构造函数 553
21.4.2 多重构造 554
21.4.3 析构 555
21.5 疑团!“this”迷宫 556
21.5.1 无数个陷阱——令人困扰的“this”谜团 556
21.5.1.1 this代词的运用 557
21.5.1.2 this“陷阱” 558
21.5.1.3 this代词的异步问题 559
21.5.2 偷梁换柱——不好的使用习惯 560
21.5.3 异步调用——谁动了我的“this” 561
21.5.4 揭开真相——JavaScript的“this”本质 562
21.5.5 困难不再——利用闭包修正“this”引用 562
21.6 包装对象 563
21.6.1 区分值和引用 563
21.6.2 装箱与拆箱 565
21.7 元类,类的模板 567
21.7.1 什么是元类 567
21.7.2 元类——构造类的类 568
21.7.3 为什么要用元类 570
21.7.4 类工厂 570
21.7.4.1 什么是类工厂 570
21.7.4.2 为什么要建立类工厂 571
21.8 谁才是造物主 571
21.8.1 万物适用的准则 571
21.8.2 抽象的极致——一个抽象模式的例子 572
21.8.3 返璞归真,同源架构 574
21.9 总结 575
第22章 闭包与函数式编程 576
22.1 动态语言与闭包 576
22.1.1 动态语言 576
22.1.2 语法域和执行域 577
22.1.3 JavaScript的闭包——一个体现闭包本质的例子 577
22.2 闭包的特点与形式 579
22.2.1 闭包的内在——自治的领域 580
22.2.2 访问外部环境——一个用闭包改变外部环境的例子 581
22.2.3 闭包和面向对象 583
22.2.4 其他形式的闭包 584
22.3 不适合使用闭包的场合 585
22.4 函数式编程 585
22.4.1 什么是函数式编程 585
22.4.1.1 函数是第一型 586
22.4.1.2 闭包与函数式编程 586
22.4.1.3 科里化(Currying)——一个有趣的概念 587
22.4.1.4 延迟求值和延续——一个Fibonacci无穷数列的例子 588
22.4.2 函数式编程、公式化与数学模型——一个抛物线方程的例子 591
22.4.3 函数式编程的优点 592
22.4.3.1 单元测试方面的优点 593
22.4.3.2 调试方面的优点 593
22.4.3.3 并行方面的优点 593
22.4.3.4 代码热部署方面的优点 594
22.4.3.5 机器辅助的推理和优化 594
22.4.4 函数式编程的缺点 594
22.4.4.1 闭包的副作用 595
22.4.4.2 递归的形式 595
22.4.4.3 延迟求值的副作用 595
22.5 闭包与面向对象 595
22.5.1 私有域 596
22.5.2 名字空间管理 597
22.5.3 友元——一个非常有趣的概念 598
22.6 Python风格的JavaScript代码 600
22.6.1 最简约代码 600
22.6.2 轻量级重用 600
22.6.2.1 JSON 600
22.6.2.2 Functional 601
22.6.2.3 迭代函数——一个Array迭代函数的例子 601
22.6.3 模块管理及其范例 605
22.7 总结 606
第23章 模块级管理 607
23.1 模块化管理 607
23.1.1 模块化——代码的重用 607
23.1.2 JavaScript的模块管理 607
23.2 开放封闭原则和面向接口 609
23.2.1 开放封闭原则 609
23.2.2 面向接口 610
23.3 名字空间管理 610
23.3.1 什么是名字空间 611
23.3.2 为什么要用名字空间 611
23.3.3 JavaScript的名字空间管理 611
23.4 调用依赖 614
23.4.1 模块的依赖性 614
23.4.2 模块依赖的管理 615
23.5 用代码管理代码 616
23.5.1 运行时环境的管理 616
23.5.2 托管代码——一个简单的托管代码“容器” 616
23.5.3 一个完整的代码管理容器 617
23.6 总结 620
第24章 动态构建 621
24.1 让代码去写代码 621
24.1.1 脚本的动态解析 621
24.1.2 语法扩展——创造属于自己的语言 621
24.2 “发明”语法 623
24.2.1 正则表达式和语法解析及例子 623
24.2.2 一个简单的语法解析器实现 627
24.2.2.1 什么是JavaScript 2.0语法 627
24.2.2.2 JavaScript 2.0语法的部分关键特性实现 629
24.3 实现自己的方言——LispScript 629
24.3.1 从JavaScript到Lisp 629
24.3.2 最初的工作——一般JavaScript代码 630
24.3.3 公理,表达式 632
24.3.4 函数式编程的七条基本公设 632
24.3.4.1 “引用”公设 632
24.3.4.2 “原子”公设 633
24.3.4.3 “等值”公设 634
24.3.4.4 “表头”公设 634
24.3.4.5 “余表”公设 635
24.3.4.6 “和表”公设 635
24.3.4.7 “条件”公设 636
24.3.5 函数文法 636
24.3.6 使用LispScript定义新函数 639
24.3.7 一个惊喜——_eval 641
24.3.8 其他的扩展 642
24.3.9 小结 642
24.3.10 运行环境和代码容器——看看“新发明”的LispScript的实际表现 643
24.4 总结 646
第25章 执行效率 647
25.1 为什么要讨论执行效率 647
25.1.1 来自客户的抱怨——JavaScript能有多慢 647
25.1.2 代码慢下来是谁的错 650
25.2 封闭的代价 651
25.2.1 过度封装的性能问题 651
25.2.2 信息隐藏的利弊 654
25.2.3 构造对象的开销 656
25.3 盒子里的流火 658
25.3.1 DOM的内存开销 659
25.3.2 浏览器的内存管理 660
25.3.3 看清一个事实——内存泄漏的存在 660
25.3.4 注意——及时关闭你的“盒子” 660
25.3.5 一些误会的澄清 661
25.3.5.1 脚本动态创建DOM导致内存泄漏 661
25.3.5.2 闭包导致内存泄漏 662
25.4 动态——魔鬼与天使 662
25.4.1 动态解析的性能分析——一个动态特性的效率测试 663
25.4.2 开发效率与执行效率——永远的困难选择 665
25.4.3 优美与适用——学会经受魔鬼的诱惑 665
25.4.4 扮演客户眼中的天使 665
25.5 让代码轻舞飞扬 666
25.5.1 简单就是美——为代码瘦身 666
25.5.2 最完美的运用是不用 666
25.5.3 高度抽象是为了简化问题 667
25.5.4 逻辑和表达同样重要 668
25.5.5 保持代码的严谨 669
25.5.6 漂亮的书写风格——让阅读者心情愉快 669
25.6 总结 670
第26章 应用框架 671
26.1 应用框架概览 671
26.1.1 什么是应用框架 671
26.1.2 应用框架的组成部分 671
26.1.2.1 类库 671
26.1.2.2 核心模块 671
26.1.2.3 环境配置 672
26.1.2.4 使用手册 673
26.2 为什么要设计应用框架 674
26.2.1 应用框架的适用范围 674
26.2.2 应用框架的利弊 674
26.3 如何设计应用框架 675
26.3.1 把握设计的目标 675
26.3.2 应用框架的设计准则 676
26.3.3 什么样的应用框架才是成熟的应用框架 676
26.3.4 应用框架的设计方法 677
26.3.5 实战!设计一个简单的应用框架 677
26.3.5.1 自描述 677
26.3.5.2 基础接口和语义型代码 678
26.3.5.3 核心对象的原型扩展 680
26.3.5.4 简单方法 682
26.3.5.5 名字空间 683
26.3.5.6 支持标准和跨浏览器 684
26.3.5.7 事件模型——Silverna的事件模型 685
26.3.5.8 应用模式 689
26.3.5.9 提供Ajax组件 690
26.3.5.10 内存管理和其他 693
26.4 框架的实际应用——在Silverna 2.0框架上开发的Widgets 693
26.5 已存在的应用框架 701
26.5.1 Prototype 702
26.5.2 JQuery 704
26.5.3 Dojo 705
26.5.4 JSVM 708
26.5.5 其他框架 710
26.5.5.1 Bindows(成立于2003年) 710
26.5.5.2 BackBase(成立于2003年) 711
26.5.5.3 DOJO(开发中,成立于2004年9月) 711
26.5.5.4 Open Rico(开发中,成立于2005年5月,基于早期的一个proprietary框架) 711
26.5.5.5 qooxdoo(开发中;成立于2005年5月) 711
26.5.5.6 Tibet(开发中,创建于2005年6月) 711
26.5.5.7 AJFORM(创建于2005年6月) 712
26.6 总结 712