經(jīng)典的《JavaScript 權(quán)威指南》中的“對象”不經(jīng)典
這些天在為Qomo項(xiàng)目寫“JavaScript面向?qū)ο蟮闹С帧边@組文章。也一直在期待網(wǎng)上購得的那本《JavaScript 權(quán)威指南》(第四版)快快到來。
在前公司,有這本書的第二或第三版,也一直將這本書視為經(jīng)典。但那時(shí)并沒有深入的去看它前幾章的概念性敘述,而是把它當(dāng)成一本手冊來查?,F(xiàn)在卻刻意地關(guān)注了,因?yàn)镼omo的底層是以純理論的OOP為基礎(chǔ)的。
今天這本書終于寄到了,但是一讀之下,大失所望。不知道作者對JavaScript語言的理解能力不夠,還是他對OOP的理解不夠?!禞avaScript權(quán)威指南》這本書對面向?qū)ο蟮臄⑹霾坏粚I(yè),而且還錯(cuò)誤百出。實(shí)在不值一看。
試舉幾例:
× JavaScript沒有正式的類的概念,……,它用構(gòu)造函數(shù)和原型對象模擬了類
事實(shí)上,JavaScript的確沒有正式的類的概念,但模擬類的只是構(gòu)造函數(shù)而不是類。因?yàn)轭愂恰奥暶鳌保瑢ο笫菍?shí)體。用“實(shí)體”去模擬“聲明”原本就說不通。在JScript中,類的檢測是通過對構(gòu)造函數(shù)來進(jìn)行的,而不是一種基于原型的檢測。
× JavaScript中的實(shí)例屬性是那些在對象中用構(gòu)造函數(shù)創(chuàng)建的或初始化的屬性
這個(gè)問題出現(xiàn)在所謂的“實(shí)例屬性”還有一種與構(gòu)造函數(shù)無關(guān)的情況,也就是直接對原型屬性聲明。例如“MyObject.prototype.prop_1 = 'abcd'”,因此上面這種定義是不完整的。
×類屬性與類方法
JavaScript中沒有“類”,因此也沒有類屬性與類方法。只不過構(gòu)造器(函數(shù))也被對象系統(tǒng)理解為“對象”,因此構(gòu)造器也可以創(chuàng)建新的屬性和方法。——這只是它作為一個(gè)“單獨(dú)的對象實(shí)例”的特性而已,把這個(gè)作為類屬性和類方法,很不合邏輯。
類似這樣的問題非常之多,顯得作者的邏輯很混亂。作者甚至沒有辦法為讀者理清腳本環(huán)境與DOM環(huán)境的異同,這在第四章關(guān)于局部變量、執(zhí)行環(huán)境和作用域等問題的討論中(4.6~4.7節(jié))尤其突出。
因此,我相信沒有多少人能讀明白這本書有關(guān)JavaScript中對象系統(tǒng)的描述。此外,這本書將JavaScript、DOM和CSS這幾種不同層次的體系揉到一起來講述,盡管使這本書內(nèi)容顯得更為豐富而且刺激了購買,然而也使讀者不得不在幾個(gè)不同的泥坑中跳來跳去,最終無所適從。
因此作為建議,最好是把這本書當(dāng)成一本手冊來查閱,而不是當(dāng)作理論上的經(jīng)典。隨便說一點(diǎn),這不是翻譯的過錯(cuò),而真的是作者的問題。
出自同一家出版社的《Delphi技術(shù)手冊》的翻譯被一些人罵得很慘,但事實(shí)上是讀不懂書的人在胡言?!潜緯姆g得是非常精道的,一些看似拗口的譯文其實(shí)很精準(zhǔn),多讀兩遍就懂了。與此相較,這本《JavaScript權(quán)威指南》的作者,看起來對“JavaScript的對象系統(tǒng)”就未必深徹地了解和思考過了。