這些天在為Qomo項目寫“JavaScript物件導向的支援”這組文章。也一直在期待網上購得的那本《JavaScript 權威指南》(第四版)快快到來。
在前公司,有這本書的第二或第三版,也一直將這本書視為經典。但那時並沒有深入的去看它前幾章的概念性敘述,而是把它當成一本手冊來查。現在卻刻意地關注了,因為Qomo的底層是以純理論的OOP為基礎的。
今天這本書終於寄到了,但是一讀之下,大失所望。不知道作者對JavaScript語言的理解能力不夠,還是他對OOP的理解不夠。《JavaScript權威指南》這本書對物件導向的敘述不但不專業,而且還錯誤百出。實在不值一看。
試舉幾例:
× JavaScript沒有正式的類的概念,……,它用建構函式和原型對象類比了類
事實上,JavaScript的確沒有正式的類的概念,但類比類的只是建構函式而不包括原型對象。因為類是“聲明”,對象是實體。用“實體”去類比“聲明”原本就說不通。在JScript中,類的檢測是通過對建構函式來進行的,而不是一種基於原型的檢測。
× JavaScript中的執行個體屬性是那些在對象中用建構函式建立的或初始化的屬性
這個問題出現在所謂的“執行個體屬性”還有一種與建構函式無關的情況,也就是直接對原型屬性聲明。例如“MyObject.prototype.prop_1 = 'abcd'”,因此上面這種定義是不完整的。
×類屬性與類方法
JavaScript中沒有“類”,因此也沒有類屬性與類方法。只不過構造器(函數)也被對象系統理解為“對象”,因此構造器也可以建立新的屬性和方法。——這隻是它作為一個“單獨的對象執行個體”的特性而已,把這個作為類屬性和類方法,很不合邏輯。
類似這樣的問題非常之多,顯得作者的邏輯很混亂。作者甚至沒有辦法為讀者理清指令碼環境與DOM環境的異同,這在第四章關於局部變數、執行環境和範圍等問題的討論中(4.6~4.7節)尤其突出。
因此,我相信沒有多少人能讀明白這本書有關JavaScript中對象系統的描述。此外,這本書將JavaScript、DOM和CSS這幾種不同層次的體系揉到一起來講述,儘管使這本書內容顯得更為豐富而且刺激了購買,然而也使讀者不得不在幾個不同的泥坑中跳來跳去,最終無所適從。
因此作為建議,最好是把這本書當成一本手冊來查閱,而不是當作理論上的經典。隨便說一點,這不是翻譯的過錯,而真的是作者的問題。
出自同一家出版社的《Delphi技術手冊》的翻譯被一些人罵得很慘,但事實上是讀不懂書的人在胡言。——那本書的翻譯得是非常精道的,一些看似拗口的譯文其實很精準,多讀兩遍就懂了。與此相較,這本《JavaScript權威指南》的作者,看起來對“JavaScript的對象系統”就未必深徹地瞭解和思考過了。