引子
編程世界裡只存在兩種基本元素,一個是數據,一個是代碼。編程世界就是在數據和代碼千絲萬縷的糾纏中呈現出無限的生機和活力。
數據天生就是文靜的,總想保持自己固有的本色;而代碼卻天生活潑,總想改變這個世界。
你看,數據代碼間的關系與物質能量間的關系有著驚人的相似。數據也是有慣性的,如果沒有代碼來施加外力,她總保持自己原來的狀態。而代碼就象能量,他存在的唯一目的,就是要努力改變數據原來的狀態。在代碼改變數據的同時,也會因為數據的抗拒而反過來影響或改變代碼原有的趨勢。甚至在某些情況下,數據可以轉變為代碼,而代碼卻又有可能被轉變為數據,或許還存在一個類似E=MC2形式的數碼轉換方程呢。然而,就是在數據和代碼間這種即矛盾又統一的運轉中,總能體現出計算機世界的規律,這些規律正是我們編寫的程序邏輯。
不過,由於不同程序員有著不同的世界觀,這些數據和代碼看起來也就不盡相同。於是,不同世界觀的程序員們運用各自的方法論,推動著編程世界的進化和發展。
眾所周知,當今最流行的編程思想莫過於面向對象編程的思想。為什麼面向對象的思想能迅速風靡編程世界呢?因為面向對象的思想首次把數據和代碼結合成統一體,並以一個簡單的對象概念呈現給編程者。這一下子就將原來那些雜亂的算法與子程序,以及糾纏不清的復雜數據結構,劃分成清晰而有序的對象結構,從而理清了數據與代碼在我們心中那團亂麻般的結。我們又可以有一個更清晰的思維,在另一個思想高度上去探索更加浩瀚的編程世界了。
在五祖弘忍講授完《對象真經》之後的一天,他對眾弟子們說:“經已講完,想必爾等應該有所感悟,請各自寫個偈子來看”。大弟子神秀是被大家公認為悟性最高的師兄,他的偈子寫道:“身是對象樹,心如類般明。朝朝勤拂拭,莫讓惹塵埃!”。此偈一出,立即引起師兄弟們的轟動,大家都說寫得太好了。只有火頭僧慧能看後,輕輕地歎了口氣,又隨手在牆上寫道:“對象本無根,類型亦無形。本來無一物,何處惹塵埃?”。然後搖了搖頭,揚長而去。大家看了慧能的偈子都說:“寫的什麼亂七八糟的啊,看不懂”。師父弘忍看了神秀的詩偈也點頭稱贊,再看慧能的詩偈之後默然搖頭。就在當天夜裡,弘忍卻悄悄把慧能叫到自己的禅房,將珍藏多年的軟件真經傳授於他,然後讓他趁著月色連夜逃走...
後來,慧能果然不負師父厚望,在南方開創了禅宗另一個廣闊的天空。而慧能當年帶走的軟件真經中就有一本是《JavaScript真經》!
回歸簡單
要理解JavaScript,你得首先放下對象和類的概念,回到數據和代碼的本原。前面說過,編程世界只有數據和代碼兩種基本元素,而這兩種元素又有著糾纏不清的關系。JavaScript就是把數據和代碼都簡化到最原始的程度。
JavaScript中的數據很簡潔的。簡單數據只有 undefined, null, boolean, number和string這五種,而復雜數據只有一種,即object。這就好比中國古典的樸素唯物思想,把世界最基本的元素歸為金木水火土,其他復雜的物質都是由這五種基本元素組成。
JavaScript中的代碼只體現為一種形式,就是function。
注意:以上單詞都是小寫的,不要和Number, String, Object, Function等JavaScript內置函數混淆了。要知道,JavaScript語言是區分大小寫的呀!
任何一個JavaScript的標識、常量、變量和參數都只是unfined, null, bool, number, string, object 和 function類型中的一種,也就typeof返回值表明的類型。除此之外沒有其他類型了。
先說說簡單數據類型吧。
簡單類型都不是對象,JavaScript沒有將對象化的能力賦予這些簡單類型。直接被賦予簡單類型常量值的標識符、變量和參數都不是一個對象。
所謂“對象化”,就是可以將數據和代碼組織成復雜結構的能力。JavaScript中只有object類型和function類型提供了對象化的能力。
沒有類
object就是對象的類型。在JavaScript中不管多麼復雜的數據和代碼,都可以組織成object形式的對象。
但JavaScript卻沒有 “類”的概念!對於許多面向對象的程序員來說,這恐怕是JavaScript中最難以理解的地方。是啊,幾乎任何講面向對象的書中,第一個要講的就是“類”的概念,這可是面向對象的支柱。這突然沒有了“類”,我們就象一下子沒了精神支柱,感到六神無主。看來,要放下對象和類,達到“對象本無根,類型亦無形”的境