面向對象這么久了,還沒找到對象?
寫代碼的小伙伴們真幸福啊,
想要對象了?沒問題,new一個就好了。
但是,new太多對象,對象也會生氣的哦。
你瞧,她來了

從兩段代碼發(fā)現(xiàn)端倪
我們來計算一個矩形的面積,看看這兩段代碼有什么區(qū)別呢?
第一段:
第二段:
有什么區(qū)別呢?區(qū)別呢?
第一段代碼是面向過程的寫法,第二段是面向對象的寫法。其中很多相同的點,變量、函數(shù)、函數(shù)調用,無論是面向過程還是面向對象,這些基本的調用邏輯還是要有的。面向對象與面向過程的區(qū)別又在哪呢?
1. ?第一個區(qū)別,是否是一個整體。第一段代碼中變量是散亂的,只有調calculateRectangleArea函數(shù)的時候,才把、寬、高、面積建立了聯(lián)系。而第二段代碼則一開始就用矩形把寬和高綁定到一起,通過初始賦值(構造函數(shù)參數(shù))將這個矩形定型為高為3寬為5的的矩形,這樣長、寬就在一個整體中了。
2. ?第二個區(qū)別,是編程思路的區(qū)別。在第一個區(qū)別的基礎上,第一段代碼需要按照書寫順序來理解代碼。從編程人的視角來看,我們面向的就是從上到下運行的這樣一個過程,簡稱面向過程。而第二段代碼,我們先創(chuàng)造了一個整體,一個矩形的整體,再操作這個整體。這個"整體"在英文中叫做Object,中文翻譯就有"對象"。當我們面向某一個整體編程的時候,我們就把這種編程思路叫做面向對象。也可以理解為面向(具象、萬物、任何),因為對象可以代表任何具體的事物。
怎樣算作對象?
非書面說法,設定屬性后的那個實際的整體,被稱作為對象。來看代碼
Rectangle這個是對象嗎?height是嗎?width呢?
都不是,這只是說一個矩形應該要有寬和高,只是設想、概念亦或者是模板。僅憑這些屬性,無法描述某一個真實的、具體的矩形。如何創(chuàng)建一個具象的?給他具體的值,再使用new創(chuàng)造一下(創(chuàng)建啥不都得來個動作么,比如捏個泥人的是不是得捏),來看代碼
通過new這個關鍵字結合具體的屬性值,我們得到了兩個具象的實際的整體(實體)。這兩個實體雖然都是矩形類型的,但很容易分辨,一個是100*200的矩形r1,另一個是6*6正方形的特殊矩形r2,對象就這樣產(chǎn)生了,這兩個實體就是對象,創(chuàng)建的過程叫做實例化
那么,還要問個問題,是不是說r1,r2 這兩個變量就是對象?
答案是否定的,這兩個變量不是對象(至少此時此刻不能這樣叫),真正的對象我們看不見、摸不著、操作不了的,創(chuàng)建的時候他在內存中,沒有名字。來看代碼
這條語句執(zhí)行之后,必然也會創(chuàng)建出來一個對象,只不過沒有給他指定任何名字,也就無法使用。類比剛降生的可愛的小寶寶,如果不給他起名字他就不存在了嗎,他是實實在在存在的。想要跟他互動,引起ta的注意就要給他起個名字,避免和旁邊其他的人混淆。r1、r2也是如此,用 r1、r2來表示創(chuàng)建出來的對象,方便使用,當然如果你了解這個過程了,我們以后也可以稱作r1、r2為對象,了解了內在邏輯,怎么叫就都可以了
什么是面向對象
面向對象(Object-Oriented,簡稱OOP)是一種編程范式或方法論,用于組織、設計和實現(xiàn)計算機程序。面向對象編程的核心思想是將程序中的數(shù)據(jù)(對象)和操作(方法)組合成一個個獨立的、可重用的模塊,這些模塊可以通過定義類和實例化對象的方式來創(chuàng)建。面向對象編程的主要目標是提高代碼的可維護性、可擴展性和可重用性。
面向對象編程有以下幾個主要概念:
構造函數(shù),也叫做類(Class):構造函數(shù)是一個模板,用于定義對象的屬性(數(shù)據(jù)成員)和行為(方法)。它描述了對象的基本結構和行為。類可以看作是創(chuàng)建對象的藍圖。
對象(Object):對象是類的一個實例,具有類定義的屬性和行為。每個對象都是獨立的,有自己的狀態(tài)和行為。
封裝(Encapsulation):封裝是將數(shù)據(jù)和方法(行為)組合到一個單元中,通過訪問權限控制來隱藏內部實現(xiàn)的細節(jié)。這可以提高代碼的模塊化和隔離性,減少了代碼之間的耦合。在js中封裝相對來說比較不好實現(xiàn)。es6中使用#定義內部屬性,這個屬性就不會被外部訪問到
繼承(Inheritance):繼承允許一個類從另一個類派生,從而繼承其屬性和方法。派生類可以擴展、修改或覆蓋基類的功能,實現(xiàn)代碼的重用和擴展。es6中使用extends關鍵字來實現(xiàn)
面向對象的好處
不聊書面用語,用例子來看
這是一個很常見的創(chuàng)建數(shù)組的方式,使用一個內置構造函數(shù)(類)Array ,通過 new的方式我們創(chuàng)建出來了一個實例對象,我們叫他arr,這個arr有很多方法,比如push、pop、shift、unshift等,這些是數(shù)組獨有的方法
再看
這個 str1 對象是字符串類型的實例,它擁有多個方法,比如 split、toLowerCase 等,然而與數(shù)組不同,str1 對象無法使用像 push、pop、shift 等數(shù)組特有的方法。一個類型的實例對象只能調用其所屬類的方法。
每個類,都很專業(yè)。一個類只負責一種特定的功能或任務,這個原則通常被稱為 "單一職責原則"。這就是面向對象的好處。接下來,繼續(xù)介紹一些其他的好處。

積木式構建:就像搭積木一樣,你可以將不同的類視為構建塊,每個類都代表一個獨立的功能或特性。通過將不同的類組合在一起,你就像是在搭建一個功能豐富的結構,每個類都負責一部分功能,最終形成一個完整的應用程序。
靈活組合:類似于積木的組合方式,不同的類可以以多種方式組合來實現(xiàn)不同的功能。你可以通過創(chuàng)建不同的類的實例,將它們組合成更大的對象,形成復雜的數(shù)據(jù)結構,從而實現(xiàn)更復雜的功能。這種組合方式可以根據(jù)需要靈活調整,實現(xiàn)不同的行為。
逐步擴展:就像你可以逐步添加積木塊來擴展你的創(chuàng)意作品一樣,你可以通過逐步添加新的類來擴展你的應用程序的功能。這種逐步添加功能的方式,使得你可以根據(jù)需求逐步完善和擴展應用,而不必一次性處理所有功能。
功能定制:類似于選擇不同類型的積木塊來創(chuàng)造不同的形狀,你可以選擇不同的類來實現(xiàn)不同的功能。每個類都代表一個特定的功能單元,你可以根據(jù)需要選擇并組合不同的功能單元,定制出符合要求的應用程序。
總的來說,將面向對象編程比作擺積木一樣的構建過程,強調了代碼的組合性、可維護性和靈活性。通過將不同的類組合在一起,你可以構建出功能豐富且高度可定制的應用程序,就像用積木搭建出各種形狀和結構一樣。這種比喻可以幫助你更好地理解面向對象編程的優(yōu)勢和應用。
那么,現(xiàn)在找到對象了嗎?祝小伙伴們都找到稱心如意的對象