經典的《JavaScript 權威指南》中的“對象”不經典
這些天在為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的對象系統”就未必深徹地了解和思考過了。