到底JavaScript算不算面向?qū)ο笳Z言?

前言
?這一章節(jié)的內(nèi)容不僅僅適合JavaScript ?也適合其他面向?qū)ο缶幊陶Z言!
?

什么是面向?qū)ο?
?==官方摘要==
**面向?qū)ο?Object Oriented): ** 是軟件開發(fā)當中的一種方法 或者說 方式,更加可以說成是一種思維方式、它是一種對現(xiàn)實世界理解和抽象的方法, 面向?qū)ο笫窍鄬τ诿嫦蜻^程來講的,面向?qū)ο蠓椒?,把相關的數(shù)據(jù)和方法組織為一個整體來看待,從更高的層次來進行系統(tǒng)建模,更貼近事物的自然運行模式
它現(xiàn)在的應用領域也不僅僅局限于程序設計和軟件開發(fā)了,它擴展到了數(shù)據(jù)庫、分布式系統(tǒng)、網(wǎng)絡管理結(jié)構、交互式界面、等領域!
?
面向?qū)ο髮д?/span>
隨著計算機技術的不斷提高,計算機被用于解決越來越復雜的問題。
????
一切事物皆對象,通過面向?qū)ο蟮姆绞剑瑢F(xiàn)實世界的事物抽象成對象,
現(xiàn)實世界中的關系抽象成類、繼承,幫助人們實現(xiàn)對現(xiàn)實世界的抽象與數(shù)字建模。
通過面向?qū)ο蟮姆椒?,更利于用人理解的方式對復雜系統(tǒng)進行分析、設計與編程。
????
同時,面向?qū)ο竽苡行岣呔幊痰男?,通過封裝技術,消息機制可以像搭積木的一樣快速開發(fā)出一個全新的系統(tǒng)。
面向?qū)ο笠彩侵敢环N程序設計范型,同時也是一種程序開發(fā)的方法。
????
對象指的是類的集合。它將對象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴展性。
????
????
面向?qū)ο蟮乃枷胍呀?jīng)涉及到軟件開發(fā)的各個方面。
????面向?qū)ο蟮姆治???(OOA,Object?Oriented?Analysis)
????面向?qū)ο蟮脑O計???(OOD,Object?Oriented?Design)
????面向?qū)ο蟮木幊虒崿F(xiàn)(OOP,Object?Oriented?Programming)
面向?qū)ο笃鹪幢尘?/span>
?面向?qū)ο笫窃诮Y(jié) ==構化設計方法== 出現(xiàn)了很多問題之后 才應運而生的。
==結(jié)構化設計方法==求解問題的基本策略是從「功能」的角度審視問題! 也就是 解決“做什么 怎么做 ?從行為的角度出發(fā)!
==結(jié)構化設計方法==將應用程序看成實現(xiàn)某些特定任務的功能模塊,在這個應用程序中的每一個模塊,都是實現(xiàn)應用程序某項具體操作的底層功能和具體的操作過程! 如果說應用程序系統(tǒng)比較小那么還好,如果是復雜的應用系統(tǒng) 那么這種做法顯然是有弱點的,如下:
?
「審視問題的視角」
結(jié)構化設計方法所采用的設計思路是以==功能==為目標來設計構造應用系統(tǒng),也就是行為, 比如說: 要做一個企業(yè)站系統(tǒng),功能有發(fā)布文章、顯示文章、添加文章、這些都是行為功能, ==但行為是不穩(wěn)定的!== 因為這些每一樣功能所實現(xiàn)的過程有很多種 并且還有其他的功能 這些是不能確定的!
通俗點說就是:確定的功能、確定模塊、以及每個模塊算法和編寫具體的代碼就寫在一堆,或?qū)懺谝粋€函數(shù)中 直接使用! 初學者就習慣這樣干!
==結(jié)構化設計方法==設計建立在不穩(wěn)定的操作之上,使得應用程序的日后維護和擴展相當困難,甚至一個微小的變動,都會波及到整個系統(tǒng), 所以這就是誕生面向?qū)ο缶幊痰氖滓?/p>
「抽象級別」
好的抽象策略可以控制問題的復雜程度,增強系統(tǒng)的通用性和可擴展性
抽象主要分: ==過程抽象==和==數(shù)據(jù)抽象==
==結(jié)構化設計方法==應用的是「過程抽象」 就是將問題中具有明確功能定義的操作代碼抽取出來 直接寫上 并看成一個整體
過程抽象級別對于軟件系統(tǒng)結(jié)構的設計顯得有些武斷,并且穩(wěn)定性差
一旦某個表示方式發(fā)生了變化,就有可能牽扯到已有系統(tǒng)的很多部分。
==數(shù)據(jù)抽象==是,將描述主體[「客體」]的屬性和行為綁定在一起,實現(xiàn)統(tǒng)一的抽象,從而達到對現(xiàn)實世界主體對象的真正模擬。
「封裝的體現(xiàn)」
==結(jié)構化設計方法==沒有做到客觀事物主體的整體封裝,只是封裝了各種功能模塊,就從代碼書寫的角度來將, 比如你寫了很多功能獨立的函數(shù)一樣, 或者說就把一些代碼裸露的寫在一個頁面上一行一行的執(zhí)行下來!
而每個功能模塊又有可能操作到?jīng)]有保護能力主體事物代碼, 也就是說其他的功能代碼的 屬性變量 或者執(zhí)行流程被 實施操作覆蓋等等!!
并且==結(jié)構化設計方法==是把描述屬性的數(shù)據(jù)與行為被分割開的,
一旦某個主體事物屬性的表達方式發(fā)生了變化,或某個行為效果發(fā)生了改變,可能就是對整個系統(tǒng)產(chǎn)生巨大影響, 也就是改一個地方其他很多地方都需要改動的原因
「面向?qū)ο蟆?/strong>就把封裝體現(xiàn)得很好,把該邏輯單元負責將所描述的屬性隱藏起來,外界對主體事物內(nèi)部屬性的所有訪問只能通過提供的用戶接口來實現(xiàn)
這樣做既可以實現(xiàn)對主體對象屬性的保護作用,又可以提高軟件系統(tǒng)的可維護性。
只要用戶接口不改變,任何封裝體內(nèi)部的改變都不會對軟件系統(tǒng)的其他部分造成影響!
「可重用性」
==重用性==是衡量一個軟件產(chǎn)品成功與否的重要標志!
然而,==結(jié)構化程序設計方法==的基本單位是模塊,每個模塊只是實現(xiàn)特定功能的過程描述, 因此,它的可重用單位只能是模塊。
所以在軟件開發(fā)的時候必須要考慮代碼的==重用性==是必然也是必須的!!
例如,在PHP語言編寫程序時使 寫一些標準函數(shù)或者自定義函數(shù), 但對于今天的軟件開發(fā)來說,這樣的重用力度顯得微不足道,而且當參與操作的某些數(shù)據(jù)類型發(fā)生變化時,就不能夠再使用那些函數(shù)了 ?因為不夠靈活
因此,渴望更大力度的可重用構件是如今應用領域?qū)浖_發(fā)提出的新需求,
這些弱點驅(qū)使人們尋求一種新的程序設計方法, 來適應現(xiàn)代社會對軟件開發(fā)的更高要求, 因此==面向?qū)ο?=由此誕生了!
面向?qū)ο?和 基于對象的區(qū)別
?很多人在這個問題上是分不清楚的,甚至也可以說是他們已經(jīng)是混淆概念
?
==面向?qū)ο?= 必然有三大特點(封裝,繼承,多態(tài))
==基于對象== 是使用對象, 就是無法利用現(xiàn)有的對象產(chǎn)生新的對象類型,繼而產(chǎn)生新的對象,也就是說基于對象沒有繼承的特點!
而且 “多態(tài)”表示為父對象的子對象實例,沒有了繼承的概念也就無從談論“多態(tài)”。
所以當你判斷一個新的技術是否是面向?qū)ο蟮臅r候,通??梢允褂煤髢蓚€特性來加以判斷,也就是 ==繼承==和==多態(tài)==
“面向?qū)ο蟆焙汀盎趯ο蟆倍紝崿F(xiàn)了“封裝”的概念,但是面向?qū)ο髮崿F(xiàn)了“繼承和多態(tài)”,而“基于對象”沒有實現(xiàn)這些
面向?qū)ο?和 面向過程
?==面向過程==就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候一個一個依次調(diào)用就可以了!
==面向?qū)ο?=是把構成問題事務分解成各個方法行為,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
?
面向?qū)ο蟮娜筇匦耘c五大原則
三大特性
1、「封裝」隱藏對象的屬性和實現(xiàn)細節(jié),僅對外提供公共訪問方式,將變化隔離,便于使用,提高復用性和安全性。 2、「繼承」提高代碼復用性;繼承是多態(tài)的前提。 3、「多態(tài)」父類 或 接口定義的引用變量可以指向子類或具體實現(xiàn)類的實例對象。提高了程序的拓展性
五大原則
1、==單一功能原則==SRP (Single Responsibility Principle) 類的功能要單一,不能包羅萬象,跟雜貨鋪似的
2、==開放封閉原則==OCP(Open-Close Principle)
開放封閉原則主要體現(xiàn)在兩個方面:
1、對擴展開放,意味著有新的需求或變化時,可以對現(xiàn)有代碼進行擴展,以適應新的情況。
2、對修改封閉,意味著類一旦設計完成,就可以獨立完成其工作,而不要對其進行任何嘗試的修改。
也就是說一個模塊對于拓展是開放的,對于修改是封閉的,想要增加功能熱烈歡迎,想要修改,哼,一萬個不樂意。
3、==里氏替換原則==LSP(the Liskov Substitution Principle LSP) 子類可以擴展父類的功能,但不能改變父類原有的功能。
子類可以實現(xiàn)父類的抽象方法,但是不能覆蓋父類的非抽象方法。
子類中可以增加自己特有的方法。
當子類覆蓋或?qū)崿F(xiàn)父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松。
4、==依賴反轉(zhuǎn)原則==DIP(the Dependency Inversion Principle DIP) 高層次的模塊不應該依賴于低層次的模塊,他們都應該依賴于抽象。抽象不應該依賴于具體實現(xiàn),具體實現(xiàn)應該依賴于抽象。
聽起來更像是“針對接口編程,而不是針對實現(xiàn)編程”
?**問題由來:**類A直接依賴類B,假如要將類A改為依賴類C,則必須通過修改類A的代碼來達成。這種場景下,類A一般是高層模塊,負責復雜的業(yè)務邏輯;類B和類C是低層模塊,負責基本的原子操作;假如修改類A,會給程序帶來不必要的風險。
「解決方案:」 將類A修改為依賴接口I,類B和類C各自實現(xiàn)接口I,類A通過接口I間接與類B或者類C發(fā)生聯(lián)系,則會大大降低修改類A的幾率。
?
在java、php中,抽象指的是接口或者抽象類,細節(jié)就是具體的實現(xiàn)類,使用接口或者抽象類的目的是==制定好規(guī)范和契約==,而不去涉及任何具體的操作,把展現(xiàn)細節(jié)的任務交給他們的實現(xiàn)類去完成。
依賴倒置原則的核心思想是「面向接口編程」。
5、==接口分離原則==ISP(the Interface Segregation Principle ISP)
接口隔離原則的含義是:建立單一接口,不要建立龐大臃腫的接口,盡量細化接口,接口中的方法盡量少。
為什么有人說JavaScript是基于對象的語言?
JavaScript不是面向?qū)ο蟮恼Z言, 并且上面我也闡述了面向?qū)ο?和 基于對象的區(qū)別,
「因為JavaScript沒有繼承的概念,進而也沒有多態(tài)的概念,缺少了繼承和多態(tài)的特性,所以我們就可以判定JavaScript就只是個基于對象的語言」
簡單地講,“面向?qū)ο缶褪前熏F(xiàn)實中的事物抽象化”
面向?qū)ο蠓椒ㄊ且环N運用對象、類、封裝、繼承、多態(tài)和消息等概念來構造、測試、重構軟件的方法。
簡言之,面向?qū)ο缶褪敲嫦蚴虑楸旧?,面向?qū)ο蟮姆治鲞^程就是認識客觀世界的過程。

極客小俊
大家的支持就是我堅持下去的動力!
