說明:如果您有任何疑問或想咨詢其他業務請撥打電話 400 685 0732
全網監測海量數據按需發布監測預警
實時把握輿情動態精準追溯信息源頭
面向對象的語言有一個標志,即擁有類的概念,抽象實例對象的公共屬性與方法,基于類可以創建任意多個實例對象,一般具有封裝、繼承、多態的特性!但JS中對象與純面向對象語言中的對象是不同的,ECMA標準定義JS中對象:無序屬性的集合,其屬性可以包含基本值、對象或者函數。可以簡單理解為JS的對象是一組無序的值,其中的屬性或方法都有一個名字,根據這個名字可以訪問相映射的值(值可以是基本值/對象/方法)
js面向對象編程——重新認識面向對象
為了說明JavaScript是一門徹底的面向對象的語言,首先有必要從面向對象的概念著手,探討一下面向對象中的幾個概念:
一切事物皆對象
對象具有封裝和繼承特性
對象與對象之間使用消息通信,各自存在信息隱藏
以這三點做為依據,C++是半面向對象半面向過程語言,因為,雖然他實現了類的封裝、繼承和多態,但存在非對象性質的全局函數和變量。Java、C#是完全的面向對象語言,它們通過類的形式組織函數和變量,使之不能脫離對象存在。但這里函數本身是一個過程,只是依附在某個類上。
然而,面向對象僅僅是一個概念或者編程思想而已,它不應該依賴于某個語言存在。比如Java采用面向對象思想構造其語言,它實現了類、繼承、派生、多態、接口等機制。但是這些機制,只是實現面向對象編程的一種手段,而非必須。換言之,一門語言可以根據其自身特性選擇合適的方式來實現面向對象。所以,由于大多數程序員首先學習或者使用的是類似Java、C++等高級編譯型語言(Java雖然是半編譯半解釋,但一般做為編譯型來講解),因而先入為主地接受了“類”這個面向對象實現方式,從而在學習腳本語言的時候,習慣性地用類式面向對象語言中的概念來判斷該語言是否是面向對象語言,或者是否具備面向對象特性。這也是阻礙程序員深入學習并掌握JavaScript的重要原因之一。
實際上,JavaScript語言是通過一種叫做原型(prototype)的方式來實現面向對象編程的。下面就來討論基于類的(class-based)面向對象和基于原型的(prototype-based)面向對象這兩種方式在構造客觀世界的方式上的差別。
基于類的面向對象和基于原型的面向對象方式比較
首先,客觀世界中的對象的產生都是其它實物對象構造的結果,而抽象的“圖紙”是不能產生“汽車”的,也就是說,類是一個抽象概念而并非實體,而對象的產生是一個實體的產生;
其次,按照一切事物皆對象這個最基本的面向對象的法則來看,類(class)本身并不是一個對象,然而原型方式中的構造器(constructor)和原型(prototype)本身也是其他對象通過原型方式構造出來的對象。
再次,在類式面向對象語言中,對象的狀態(state)由對象實例(instance)所持有,對象的行為方法(method)則由聲明該對象的類所持有,并且只有對象的結構和方法能夠被繼承;而在原型式面向對象語言中,對象的行為、狀態都屬于對象本身,并且能夠一起被繼承(參考資源),這也更貼近客觀實際。
類式面向對象語言比如Java,為了彌補無法使用面向過程語言中全局函數和變量的不便,允許在類中聲明靜態(static)屬性和靜態方法。而實際上,客觀世界不存在所謂靜態概念,因為一切事物皆對象!如果大家還想了解更多與之有關的信息,歡迎關注我們文軍營銷的官網。
推薦閱讀
說明:如果您有任何疑問或想咨詢其他業務請撥打電話 400 685 0732