前面一篇咱們回顧了面向對象概念和JAVA的對象核心概念,但實際上,JAVA是一種基於類繼承的面嚮對象語言,而javascript是基於原型的面嚮對象語言,咱們就不糾結於基於類和基於原型的優劣,也無論它們的設計原理,咱們只從使用的角度進行理解和說明。有些文章建議徹底拋棄JAVA這種基於類面向對象,清空大腦,再去學習javascript這種基於原型的面向對象設計,但這是不可能的。這裏有篇文章對此進行了闡述:http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/,你們能夠去參考。javascript
javascript有三類對象類型:本地對象、內置對象和宿主對象。java
本地對象web
獨立於宿主環境的ECMAScript實現提供的對象。其實就是ECMAScript中定義的類,包括有:Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、RefereneError、SyntaxError、TypeError、URIError。瀏覽器
很敏感的,我看到了Object類,那麼是否是其餘的類都是繼承自Object?沒有答案,誰知道能夠告訴我。咱們只須要知道這些是預先定義好的類,能夠直接實例化使用。具體使用方法請參考相關API文檔。服務器
內置對象函數
由ECMAScript實現提供,獨立於宿主環境的全部對象,在ECMAScript執行時出現。只有兩個對象Global和Math。根據定義,內置對象是本地對象。Math比較容易理解,你就當作本地對象同樣使用便可,並且不用實例化,覺得已經實例化了。重點講講Glaobal對象(全局對象)。學習
Global對象很是特殊,其實根本不存在,由於你沒法使用它,那麼它起什麼做用呢?this
它是做爲 JavaScript 的全局函數和全局屬性的佔位符而存在,經過使用全局對象,能夠訪問全部其餘全部預約義的對象、函數和屬性。全局對象不是任何對象的屬性,因此它沒有名稱。spa
在頂層 JavaScript 代碼中,能夠用關鍵字 this 引用全局對象。但一般沒必要用這種方式引用全局對象,由於全局對象是做用域鏈的頭,這意味着全部非限定性的變量和函數名都會做爲該對象的屬性來查詢。例如,當JavaScript 代碼引用 parseInt() 函數時,它引用的是全局對象的 parseInt 屬性。全局對象是做用域鏈的頭,還意味着在頂層 JavaScript 代碼中聲明的全部變量都將成爲全局對象的屬性。全局對象只是一個對象,而不是類。既沒有構造函數,也沒法實例化一個新的全局對象。設計
簡單的比喻能夠概要性理解全局對象:在JAVASCRIPT中沒有人(對象)要的屬性啊、方法啊,能夠簡單理解爲都是去全局對象的,沒人要的,都是個人,呵呵。這樣能夠保證一種語言的一致性:ECMAScript中,不存在獨立的函數,全部函數都必須是某個對象的方法。這樣是否是保證了面向對象的純潔性?也許由於此,javascript纔可以被稱爲是面向對象的語言,起碼錶面上看起來是這樣。
宿主對象
所非本地的對象都是宿主對象,由ECMACript實現的宿主環境提供的對象。說了半天,什麼是宿主環境?宿主環境簡單說就是javascript寄存的宿主的環境,如瀏覽器環境、服務器環境。基於此概念,咱們本身定義的對象,應該就是在某個宿主環境的對象。
全部本地對象都繼承自Object對象,內置對象也是本地對象,所以和JAVA同樣,Object對象是根對象。
本地對象和內置對象構成了語言體系:Object、Function分別對應對象和函數概念,Array、String、Boolean、Number對應基本的數據類型,Date是時間日期,RegExp是正則對象,其餘是對語言內部錯誤進行分類的錯誤對象:Error、EvalError、RangeError、RefereneError、SyntaxError、TypeError、URIError,Golbal更是重要的語言必須的對象,Math用於複雜的數學計算,爲何歸入核心語言,尚需研究。