# JavaScript Patterns

**“JavaScript patterns”中譯本** - 《JavaScript 模式》
- 作者:[Stoyan Stefanov](http://www.phpied.com/)
- 翻譯:[拔赤](http://jayli.github.com/)、[goddyzhao](http://goddyzhao.me)、[TooBug](http://www.toobug.net)
偷懶是程序員的優良品質,模式則是先人們總結的偷懶招式。Stoyan Stefanov 的這本書,從 JavaScript 的實際使用場景出發,提煉了不少可以讓前端們偷懶的實用招式。模式的探索、創新,將永遠是程序員自我提升的一條修煉之道。值得一讀。
# 目錄
## [第一章 概述](chapter1.md)
- [模式](chapter1.md)
- [JavaScript:概念](chapter1.md#a2)
- [面向對象](chapter1.md#a3)
- [無類](chapter1.md#a4)
- [原型](chapter1.md#a5)
- [運行環境](chapter1.md#a6)
- [ECMAScript 5](chapter1.md#a7)
- [JSLint](chapter1.md#a8)
- [控制臺工具](chapter1.md#a9)
## [第二章 高質量JavaScript基本要點](chapter2.md)
- [編寫可維護的代碼](chapter2.md#a2)
- [減少全局對象](chapter2.md#a3)
- [全局對象帶來的困擾](chapter2.md#a4)
- [忘記var時的副作用](chapter2.md#a5)
- [訪問全局對象](chapter2.md#a6)
- [單 var 模式](chapter2.md#a7)
- [聲明提前:分散的 var 帶來的問題](chapter2.md#a8)
- [for 循環](chapter2.md#a9)
- [for-in 循環](chapter2.md#a10)
- [(不)擴充內置原型](chapter2.md#a11)
- [switch 模式](chapter2.md#a12)
- [避免隱式類型轉換](chapter2.md#a13)
- [避免使用 eval()](chapter2.md#a14)
- [使用parseInt()進行數字轉換](chapter2.md#a15)
- [編碼風格](chapter2.md#a16)
- [縮進](chapter2.md#a17)
- [花括號](chapter2.md#a18)
- [左花括號的放置](chapter2.md#a19)
- [空格](chapter2.md#a20)
- [命名規范](chapter2.md#a21)
- [構造器命名中的大小寫](chapter2.md#a22)
- [單詞分隔](chapter2.md#a23)
- [其他命名風格](chapter2.md#a24)
- [書寫注釋](chapter2.md#a25)
- [書寫API文檔](chapter2.md#a26)
- [一個例子:YUIDoc](chapter2.md#a27)
- [編寫易讀的代碼](chapter2.md#a28)
- [相互評審](chapter2.md#a29)
- [生產環境中的代碼壓縮(Minify)](chapter2.md#a30)
- [運行JSLint](chapter2.md#a31)
- [小結](chapter2.md#a32)
## [第三章 直接量和構造函數](chapter3.md)
- [對象直接量](chapter3.md#a2)
- [對象直接量語法](chapter3.md#a3)
- [通過構造函數創建對象](chapter3.md#a4)
- [獲得對象的構造器](chapter3.md#a5)
- [自定義構造函數](chapter3.md#a6)
- [構造函數的返回值](chapter3.md#a7)
- [強制使用new的模式](chapter3.md#a8)
- [命名約定](chapter3.md#a9)
- [使用that](chapter3.md#a10)
- [調用自身的構造函數](chapter3.md#a11)
- [數組直接量](chapter3.md#a12)
- [數組直接量語法](chapter3.md#a13)
- [有意思的數組構造器](chapter3.md#a14)
- [檢查是不是數組](chapter3.md#a15)
- [JSON](chapter3.md#a16)
- [使用JSON](chapter3.md#a17)
- [正則表達式直接量](chapter3.md#a18)
- [正則表達式直接量語法](chapter3.md#a19)
- [原始值的包裝對象](chapter3.md#a20)
- [Error對象](chapter3.md#a21)
- [小結](chapter3.md#a22)
## [第四章 函數](chapter4.md)
- [背景知識](chapter4.md#a2)
- [術語釋義](chapter4.md#a3)
- [聲明 vs 表達式:命名與提前](chapter4.md#a4)
- [函數的name屬性](chapter4.md#a5)
- [函數提前](chapter4.md#a6)
- [回調模式](chapter4.md#a7)
- [一個回調的例子](chapter4.md#a8)
- [回調和作用域](chapter4.md#a9)
- [異步事件監聽](chapter4.md#a10)
- [超時](chapter4.md#a11)
- [庫中的回調](chapter4.md#a12)
- [返回函數](chapter4.md#a12)
- [自定義函數](chapter4.md#a14)
- [立即執行的函數](chapter4.md#a15)
- [立即執行的函數的參數](chapter4.md#a16)
- [立即執行的函數的返回值](chapter4.md#a17)
- [好處和用法](chapter4.md#a18)
- [立即初始化的對象](chapter4.md#a19)
- [條件初始化](chapter4.md#a20)
- [函數屬性——Memoization模式](chapter4.md#a21)
- [配置對象](chapter4.md#a22)
- [柯里化 (Curry)](chapter4.md#a23)
- [函數應用](chapter4.md#a24)
- [部分應用](chapter4.md#a25)
- [柯里化](chapter4.md#a26)
- [什么時候使用柯里化](chapter4.md#a27)
- [小結](chapter4.md#a28)
## 第五章 對象創建模式
- 命名空間模式
- 通用的命名空間函數
- 聲明依賴
- 私有屬性和方法
- 私有成員
- 特權方法
- 私有化失敗
- 對象直接量及其私有成員
- 原型及其私有成員
- 將私有函數暴露為共有方法
- 模塊模式
- 暴露模塊模式
- 創建構造器的模塊
- 在模塊中引入全局上下文
- 沙箱模式
- 全局構造函數
- 添加模塊
- 實現這個構造函數
- 靜態成員
- 共有靜態成員
- 私有靜態成員
- 對象常量
- 鏈式調用模式
- 鏈式調用模式的利弊
- method() 方法
- 小節
## [第六章 代碼復用模式](chapter6.md#a1)
- [類式繼承 vs 現代繼承模式](chapter6.md#a2)
- [類式繼承的期望結果](chapter6.md#a3)
- [類式繼承 1 ——默認模式](chapter6.md#a4)
- [跟蹤原型鏈](chapter6.md#a5)
- [這種模式的缺點](chapter6.md#a6)
- [類式繼承 2 ——借用構造函數](chapter6.md#a7)
- [原型鏈](chapter6.md#a8)
- [利用借用構造函數模式實現多繼承](chapter6.md#a9)
- [借用構造函數的利與弊](chapter6.md#a10)
- [類式繼承 3 ——借用并設置原型](chapter6.md#a11)
- [類式繼承 4 ——共享原型](chapter6.md#a12)
- [類式繼承 5 —— 臨時構造函數](chapter6.md#a13)
- [存儲父類](chapter6.md#a14)
- [重置構造函數引用](chapter6.md#a15)
- [Klass](chapter6.md#a16)
- [原型繼承](chapter6.md#a17)
- [討論](chapter6.md#a18)
- [例外的ECMAScript 5](chapter6.md#a19)
- [通過復制屬性繼承](chapter6.md#a20)
- [混元(Mix-ins)](chapter6.md#a21)
- [借用方法](chapter6.md#a22)
- [例:從數組借用](chapter6.md#a23)
- [借用并綁定](chapter6.md#a24)
- [Function.prototype.bind()](chapter6.md#a25)
- [小結](chapter6.md#a26)
## [第七章 設計模式](chapter7.md#a1)
- [單例](chapter7.md#a2)
- [使用new](chapter7.md#a3)
- [將實例放到靜態屬性中](chapter7.md#a4)
- [將實例放到閉包中](chapter7.md#a5)
- [工廠模式](chapter7.md#a6)
- [內置對象工廠](chapter7.md#a7)
- [迭代器](chapter7.md#a8)
- [裝飾器](chapter7.md#a9)
- [用法](chapter7.md#a10)
- [實現](chapter7.md#a11)
- [使用列表實現](chapter7.md#a12)
- [策略模式](chapter7.md#a13)
- [數據驗證示例](chapter7.md#a14)
- [外觀模式](chapter7.md#a15)
- [代理模式](chapter7.md#a16)
- [一個例子](chapter7.md#a17)
- [中介者模式](chapter7.md#a18)
- [中介者示例](chapter7.md#a19)
- [觀察者模式](chapter7.md#a20)
- [例1:雜志訂閱](chapter7.md#a21)
- [例2:按鍵游戲](chapter7.md#a22)
- [小結](chapter7.md#a23)
## 第八章 DOM和瀏覽器模式
- 分離關注點
- DOM 腳本編程
- DOM訪問
- DOM操作
- 事件
- 事件處理
- 事件委托
- 長時間運行的腳本
- setTimeout()
- Web Workers
- 遠程腳本
- XMLHttpRequest
- JSONP
- Frame和Image加載指示器
- 部署JavaScript
- 合并腳本
- 代碼減肥和壓縮
- 過期頭
- 使用CDN
- 加載策略
- script標簽的位置
- HTTP 分塊
- 動態插入script標簽非阻塞載入腳本
- 延遲加載
- 按需加載
- 預加載
- 小節
## 索引