天天看點

《JavaScript應用程式設計》一一3.2 流式JavaScript

本節書摘來華章計算機出版社《javascript應用程式設計》一書中的第3章,第3.2節,作者:eric elliott 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

我并沒有發明一種全新風格的,或綜合性的,抑或是修正性的國術體系。我也決不将截拳道

建立成受某些法則控制的差別于“這種風格”或“那種風格”的固定套路。相反,

我希望解放我的同仁們,使他們不再受格鬥風格、國術形式和各種主義的奴役。

……真理往往蘊含在簡單的動作中。

——李小龍

從其他語言轉投javascript陣營的程式員可以被看作新進移民,他們總是抱着之前語言的思維模式去解決問題。例如,具有傳統面向對象程式設計經驗的程式員在javascript中,會把時間浪費在糾結構造函數的使用上,構造函數是面向對象語言時代下的舊産物,在javascript中,它會帶來時間與效率的損耗。

不幸的是,在現今大多數javascript教程中,讀者看到的往往是使用構造函數的方式去建立對象。

這種方式有幾個弊端,首先,你必須每次以new關鍵字為字首去調用構造函數,缺少new關鍵字會導緻構造函數錯把this指向全局對象,之後你所有的屬性與方法指派都會對全局對象造成污染,特别是在應用中,一個構造函數常常會執行個體化多個對象,是以你需要格外小心。不過在嚴格模式下,情況會稍有不同,缺少關鍵字new的對象執行個體化會導緻程式抛出異常。

在每個構造函數中逐一對this的指向做檢查,可以對此類問題做簡單的規避,不過在javascript中任何函數都能夠傳回對象,是以并不是所有對象被建立時都需要new關鍵字。 使用命名約定可以幫助我們判斷哪些場景下需要使用new關鍵字,一般來說,構造函數的首字母是大寫,那麼當遇見首字母為大寫的函數調用時便使用new關鍵字。但是這裡有一個問題,許多第三方類庫的命名空間也是采用這種命名格式,符合命名約定的辨別符并不一定就是構造函數,是以這個方案的實際效果并不理想,甚至沒有解決根本問題。

真正的問題在于構造函數将迫使你使用傳統面向對象程式設計的思維模式去考慮問題,由于構造函數在某種程度上等同于類,應用還在代碼設計時,你可能就開始琢磨,“嗯,我需要一個x類的子類”,接着你便陷入了麻煩中。你忽略了javascript中最強大的兩個特性:動态對象擴充與原型繼承。組合使用這兩個特性,能讓你在代碼複用性與靈活性方面遠勝于類繼承。

把javascript作為程式設計母語的程式員不會被傳統的面向對象思維所束縛,因為他們清楚javascript中有更為簡潔的原生實作方案。拜讀資深javascript程式員的代碼可以使你受益匪淺。

就像不同的程式設計語言會有不同的文法特性一樣,事實上,在幾乎所有學科領域中都會包含不同的流派。國術又分為跆拳道、柔道、搏擊、空手道、功夫等流派,每種流派都擁有不同的理念、方法與核心技巧。在《截拳道之道》一書中,李小龍建議每一個習武之人都應該去建立自己的國術套路,學習并掌握不同流派的武技,做到取其精華,去其糟粕,最終形成自己獨一無二的國術風格,這便是自由搏擊(不同國術流派技藝的最佳結合産物)的核心所在。

程式設計語言亦然,javascript本身就是一個借鑒了包括scheme(lambda)、self(原型繼承)、java(文法)等語言特性的融合物。

總地來說,流式風格意味着在程式設計中丢棄那些低效的構造函數,并最大程度地使用javascript本身強大的語言特性。

lambdas與閉包

作為一種最小的通用程式設計語言, lambda表達式強大、簡單且優雅。理論上來說,任何計算機算法都可以被包裝為lambdas。lambdas同時也是構成函數式程式設計的基本要素。

對象字面量

這是建構一個對象執行個體的最快方法。作為它的兄弟成員,數組字面量也有同樣的特性。

動态對象擴充

動态對象擴充讓你能夠輕松地使用混入、組合、聚合等代碼複用模式來對對象進行方法或屬性擴充,即使對象已經被執行個體化。子類繼承模式會帶來額外的類型判定,它會讓代碼喪失靈活性且變得更加易碎。

繼續閱讀