第Ⅰ部分奠定堅實的基礎第1章實踐軟件工程 3
1.1編寫從開始就正確的代碼 4
1.1.1掌握JavaScript的特性 4
1.1.2在大型系統中規避JavaScript陷阱 15
1.1.3應用軟件工程原則 17
1.2編寫保持正確的代碼 22
1.2.1投資單元測試的未來 22
1.2.2實踐測試驅動開發 22
1.2.3編寫易于測試的代碼 23
1.3小結 26
第2章準備工具 27
2.1使用測試框架 27
2.1.1辨別不正確的代碼 30
2.1.2可測試性設計 32
2.1.3編寫最少的代碼 33
2.1.4安全維護和重構 33
2.1.5可運行規范 34
2.1.6當前的開源和商業框架 34
2.1.7介紹Jasmine 36
2.2使用依賴注入框架 41
2.2.1依賴注入的定義 41
2.2.2使用依賴注入讓代碼更可靠 43
2.2.3掌握依賴注入 43
2.2.4案例研究:編寫一個輕量級依賴注入框架 43
2.2.5使用依賴注入框架 50
2.2.6當前的依賴注入框架 52
2.3使用切面工具 53
2.3.1案例研究:使用和不使用AOP進行緩存 53
2.3.2案例研究:構建Aop.js模塊 55
2.3.3其他AOP庫 67
2.3.4結論 68
2.4使用代碼檢查工具 68
2.4.1使用linting工具讓代碼更可靠 68
2.4.2JSHint簡介 71
2.4.3其他工具 73
2.4.4嚴格模式 74
2.5小結 74
第3章構造可靠的對象 75
3.1使用原生數據 75
3.2使用對象字面量 77
3.3使用模塊模式 78
3.3.1創建任意模塊 78
3.3.2創建立即執行模塊 79
3.3.3創建可靠的模塊 80
3.4使用對象原型和原型繼承 80
3.4.1默認對象原型 80
3.4.2原型繼承 81
3.4.3原型鏈 82
3.5使用new創建對象 83
3.6使用類繼承 88
3.6.1模擬類繼承 88
3.6.2重復將殺死Kangaroo 89
3.7使用函數式繼承 91
3.8猴子補丁(Monkey-Patching) 92
3.9小結 95
第Ⅱ部分測試基于模式的代碼
第4章瀏覽各種模式的優點 99
4.1案例分析 99
4.2通過更廣泛的詞匯產生更加優雅的代碼 100
4.3使用擁有良好設計、良好測試的構建塊產生可靠的代碼 101
4.4小結 102
第5章確保回調模式的正確使用 103
5.1通過單元測試了解回調模式 104
5.1.1編寫和測試使用了回調函數的代碼 104
5.1.2編寫和測試回調函數 109
5.2避免問題 113
5.2.1扁平化回調箭頭 113
5.2.2注意this變量 115
5.3小結 119
第6章確保承諾模式的正確使用 121
6.1通過單元測試了解承諾 122
6.1.1使用承諾 122
6.1.2構造和返回承諾 127
6.1.3測試XMLHttpRequest 130
6.2串聯承諾 133
6.3使用承諾封裝器 134
6.4了解狀態和命運 135
6.5區分標準承諾和jQuery承諾 135
6.6小結 136
第7章確保正確使用散函數應用程序 137
7.1對散函數應用程序進行單元測試 137
7.2為散函數應用程序創建切面 139
7.3區分散函數應用程序和柯里化 140
7.3.1柯里化 140
7.3.2散函數應用程序 141
7.4小結 141
第8章確保備忘錄模式的正確使用 143
8.1通過單元測試了解備忘錄模式 144
8.2使用AOP添加備忘錄 147
8.2.1創建備忘錄切面 147
8.2.2為restaurantApi應用returnValueCache切面 150
8.3小結 152
第9章確保單例模式的正確實現 153
9.1通過單元測試了解單例模式 154
9.1.1使用對象字面量實現單例共享緩存 154
9.1.2使用模塊實現單例共享緩存 158
9.2小結 162
第10章確保工廠模式的正確實現 163
10.1為工廠編寫單元測試 163
10.2實現工廠模式 169
10.3考慮其他工廠類型 171
10.4小結 171
第11章確保沙箱模式的正確實現和使用 173
11.1通過單元測試了解沙箱模式 173
11.1.1創建部件沙箱 174
11.1.2創建和測試沙箱工具 187
11.1.3創建與沙箱一起使用的函數 191
11.2小結 193
第12章確保裝飾器模式的正確實現 195
12.1使用測試驅動的方式開發裝飾器 196
12.1.1為被裝飾的對象編寫一個假對象 197
12.1.2為錯誤的傳遞編寫測試 198
12.1.3編寫空白裝飾器 199
12.1.4添加傳遞功能到裝飾器 200
12.1.5驗證成功傳遞 202
12.1.6添加裝飾器的特性 204
12.1.7通用化裝飾器 210
12.2小結 211
第13章確保策略模式的正確實現 213
13.1通過單元測試了解該模式 213
13.1.1在不使用策略模式的情況下實現transportScheduler 214
13.1.2使用策略模式實現transportScheduler 216
13.2小結 227
第14章確保代理模式的正確實現 229
14.1通過測試驅動的方式開發代理 230
14.2小結 245
第15章確保正確實現可鏈接方法 247
15.1通過單元測試了解該模式 248
15.2鏈接then方法 255
15.3小結 257
第Ⅲ部分測試和編寫高級JavaScript特性
第16章在無接口語言中遵守接口 261
16.1了解接口的優點 262
16.2了解接口隔離原則 263
16.3使用測試驅動開發創建契約注冊表 265
16.3.1定義契約 266
16.3.2判斷是否履行了契約 267
16.3.3斷言契約被履行了 271
16.3.4繞過契約執行 273
16.3.5創建在被返回(創建)的對象上實施契約的切面 273
16.4小結 277
第17章確保正確的參數類型 279
17.1了解JavaScript無類型參數帶來的機會和風險 280
17.2擴展ContractRegistry檢查參數 280
17.2.1界定任務范圍 280
17.2.2判斷集合中的所有變量是否都履行了它的契約 281
17.2.3斷言集合中的所有變量都履行了它的契約 289
17.2.4在切面中打包參數檢查功能 290
17.3支持契約庫 292
17.4綜合起來 293
17.4.1創建契約模塊 293
17.4.2創建應用程序的ContractRegistry 296
17.4.3為生產發布繞過契約 297
17.5比較面向切面的解決方案和靜態解決方案 297
17.5.1考慮TypeScript的優點 297
17.5.2考慮切面的優點 297
17.6小結 298
第18章確保正確使用call、apply和bind 299
18.1瀏覽this是如何綁定的 299
18.1.1默認綁定 300
18.1.2隱式綁定 302
18.1.3new綁定 303
18.1.4顯式綁定 305
18.2創建和測試使用call、apply和bind的代碼 305
18.2.1使用call和apply 305
18.2.2使用測試驅動開發創建一個Array.prototype.forEachPolyfill 307
18.2.3使用bind 316
18.3小結 321
第19章確保正確使用方法借用 323
19.1確保借用對象符合需求 324
19.1.1讓被借用的函數驗證借用者的資格 324
19.1.2向被借用的對象附加切面 326
19.1.3使用borrow()方法 329
19.1.4在ContractRegistry中添加對象驗證器 330
19.2預期借用者的副作用 331
19.2.1考慮被隔離函數的副作用 331
19.2.2考慮調用其他函數的函數的副作用 332
19.3預期捐贈者對象的副作用 338
19.4小結 339
第20章確保正確使用混合 341
20.1創建和使用混合 343
20.1.1創建和使用傳統混合 344
20.1.2創建和使用函數式混合 361
20.2小結 367
第21章測試高級程序架構 369
21.1確保觀察者模式的可靠使用 369
21.1.1檢查觀察者模式 370
21.1.2增強觀察者模式的可靠性 376
21.2確保中介者模式的可靠使用 380
21.2.1了解中介者模式 381
21.2.2增強基于中介者代碼的可靠性 382
21.3小結 395
第Ⅳ部分測試中的特殊主題
第22章測試DOM訪問 399
22.1對UI進行單元測試 399
22.1.1檢查難于測試的UI代碼 400
22.1.2使用TDD創建UI組件 401
22.2使用分析器優化代碼 411
22.2.1檢測低效代碼 411
22.2.2避免不成熟的優化 418
22.3小結 418
第23章確保符合標準 419
23.1使用ESLint 420
23.1.1安裝ESLint 420
23.1.2運行ESLint 424
23.1.3使用ESLint實施代碼標準 427
23.2實施架構分離 432
23.2.1家庭秘密技術 433
23.2.2銘記技術 435
23.2.3不可能任務(MissionImpossible)技術 437
23.2.4魔術棒(MagicWand)
技術 441
23.2.5不要使用調用棧技術 442
23.2.6其他技術 442
23.2.7其他架構 442
23.3小結 443
第Ⅴ部分總結
第24章測試驅動開發原則的總結 447
24.1回顧值得使用測試驅動開發的原因 447
24.2練習測試驅動開發 448
24.3編寫可單元測試的代碼 448
24.4掌握測試驅動開發的
技術 448
24.4.1在編碼之前編寫測試 448
24.4.2保持測試DRY 449
24.4.3首先測試錯誤條件 449
24.4.4測試要先易后難 449
24.4.5具體 449
24.4.6只測試一件事情 450
24.4.7測試數據如同測試一樣重要 450
24.4.8高效地使用Jasmine 450
24.5測試本書描述的模式 450
24.5.1測試面向切面編程 450
24.5.2測試對象構造 451
24.5.3測試回調 451
24.5.4測試基于承諾的代碼 451
24.5.5測試散函數應用程序 451
24.5.6測試備忘錄模式 452
24.5.7測試單例模式 452
24.5.8測試工廠模式 452
24.5.9測試沙箱 452
24.5.10測試裝飾器模式 453
24.5.11測試策略模式 453
24.5.12測試代理模式 453
24.5.13測試可鏈接方法 453
24.5.14測試接口一致性 453
24.5.15測試call和apply的
使用 453
24.5.16測試方法借用模式 454
24.5.17測試混合 454
24.5.18測試中介者和觀察者模式 454
24.5.19測試DOM訪問 454
24.5.20實施架構分離的測試 454
24.6小結 455
第25章本書JavaScript習語的總結 457
25.1回顧對象 457
25.1.1可以添加和刪除的對象屬性 457
25.1.2可以將對象用作詞典 458
25.2回顧變量 459
25.2.1提升變量聲明 459
25.2.2變量有函數作用域 460
25.3回顧函數 463
25.3.1函數是對象 463
25.3.2提升函數聲明 463
25.3.3函數沒有返回類型 464
25.3.4函數可以是匿名的 465
25.3.5函數可以被嵌套 465
25.3.6函數調用可以使用任意數量的參數 466
25.3.7函數可以立即被調用 467
25.4回顧布爾操作 468
25.4.1在測試相等性時類型可能會被強制轉換 468
25.4.2值可以是真或假 469
25.5小結 469