犀牛書學習筆記(4):面向對象(OOP)之回顧JAVA

這篇要談的面向對象(OOP),OOP被廣泛認識並應用,個人經歷是從JAVA語言開始,javascript一直都說:我和JAVA不要緊,但從前面的語法結構、運算符、標示符關鍵字等等幾乎都與JAVA同樣,起碼來講是大量、甚至是爲了迎合市場需求,徹底照抄了JAVA,但其語言核心確實是兩個徹底不一樣的語言。但js確實是面嚮對象語言,由於它支持封裝、彙集、繼承和多態四個OOP基本特徵。javascript

犀牛書對js的OOP講解我的感受不夠直接易懂,以我多年來JAVA創建的嚴謹OOP思惟,看函數章節時很是的頭痛(OOP語言怎麼會有這麼麻煩的函數?),當看到對象章節,本覺得會容易理解,結果幾乎崩潰。但爲了掌握這門語言,耐着性子,翻閱了其餘的書籍,逐步有了一些新的理解,特別是匹配JAVA語言背景的狀況的理解,不必定正確,這裏記錄下來。java

OOP中,首先應該有類定義,來是現實世界的描繪,是對象的模板,對象從類實例化而來,是類的具象化。ECMAScript把對象定義描述爲對象的配方,沒有正式的類,所以類並不存在。既然規範這麼定義,包括基本權威書籍,都沒有將類概念單獨拿出來講,從個人理解,其實對象定義,是近似於類,起碼從功能和做用來講,二者是等價的,能夠二者混在一塊兒來講。函數

回顧JAVA語言的對象,目的是藉助對JAVA對象概念,幫助咱們理解JS的對象。沒有翻閱資料,憑印象來聊聊,主要是基本概念,不保證嚴謹。學習

一、一切均是對象。爲了效率,JAVA中基本類型如int、boolean等不是對象,但都具備封裝對象,其餘一切都可描述爲對象,都繼承自根對象Object。對象

二、對象都具備構造函數,在對象實例化過程當中執行初始化,且首先會調用super()。若是不定義構造函數,JVM會默認執行無參數構造函數;繼承

三、對象由構造函數、屬性和方法組成,爲保證封裝性,可以使用做用域標示符private、protected、public、default等標示可訪問性;接口

四、類、抽象類、接口都是對象,也都是繼承自Object。ip

五、類定義是對現實世界的抽象,對象從類實例化而來,是以類爲模板,具象化的實體;作用域

六、抽象類是類的模板,體現總體和個體之間的差別化;原型

七、接口是對象間交互方式的約定,是定義類的契約。

從這些描述,能夠很是容易的想象出一個以Object爲根的對象樹。良好的封裝性、規範的定義語法、清晰的結構關係,使之成爲很是穩定可靠的對象描述系統。

以OOP思路對現實進行建模的時候,對象屬性抽象物件的屬性,對象方法抽象物件的行爲,方法同時做爲對象間交流的消息傳遞接口,實現對象間的交互,從而構建系統模型。

整體上講,JAVA、C++這類語言是基於類的面向對象,而JS是基於原型的面向對象,具備基於類的面向對象基礎以後,再理解JS就感受很是的彆扭,但對於已經屬性基於類的面向對象知識以後,不可避免會受到干擾。我的理解,在JS面向原型面嚮對象語言學習的時候,若是比對你的JAVA經驗,可以找到相同和不一樣的地方,可以更加透徹的加深理解。畢竟雖然實現面對對象的方式不一樣,但二者要達成的目標是一致的。

後面一篇咱們將藉助對JAVA對象的理解,來學習JS的對象模型。

相關文章
相關標籤/搜索