javascript面向對象系列第四篇——OOP中的常見概念

来源:http://www.cnblogs.com/xiaohuochai/archive/2017/12/11/7896586.html
-Advertisement-
Play Games

[1]對象 [2]類 [3]封裝 [4]聚合 [5]繼承 [6]多態 ...


前面的話

  面向對象描述了一種代碼的組織結構形式——一種在軟體中對真實世界中問題領域的建模方法。本文將從理論層面,介紹javascript面向對象程式程式(OOP)中一些常見的概念

 

對象

  所謂對象,本質上就是指事物(包括人和物)在程式設計語言中的表現形式。這裡的事物可以是任何東西(如某個客觀存在的對象,或者某些較為抽象的概念)。例如,對於貓這種常見對象來說,具有某些明確的特征(如顏色、名字、體型等),能執行某些動作(如喵喵叫、睡覺、躲起來、逃跑等)。在OOP語義中,這些對象特征都叫做屬性,而那些動作則被稱為方法

  此外,還有一個口語方面的類比:對象往往是用名詞表示的(如book、person),方法一般都是些動詞(如read、run),屬性值則往往是一些形容詞

“The black cat sleeps on my head”

  cat是一個對象,black是一個顏色屬性值,sleep代表一個動作,也就是OOP語義中的方法。on my head是動作sleep的限定條件。因此它可以當做傳遞給sleep方法的一個參數

 

  在現實生活中,相似對象之間往往都有一些共同的組成特征。例如蜂鳥和老鷹都具有鳥類的特征,因此它們可以被統稱為鳥類。在OOP中,類實際上就是對象的設計藍圖或製作配方。對象這個詞,有時候也叫做實例。所以,老鷹是鳥類的一個實例。可以基於同一個類創建出許多不同的對象,因為類更多的是一種模板。而對象則是在這些模板的基礎上被創建出來的實體

  javascript實際上壓根沒有類。該語言的一切都是基於對象的,其依靠的是一套原型(prototype)系統。而原型本身實際上也是一種對象

  在傳統的面向對象語言中,基於Person類創建了一個Match的新對象,而在javascript中,則是將現有的Person對象擴展成一個Match的新對象

 

封裝

  封裝主要用於闡述對象中所包含的內容。封裝概念通常由兩部分組成:相關的數據(用於存儲屬性)、基於這些數據所能做的事(所能調用的方法)

  封裝的目的是將信息隱藏,即方法與屬性的可見性。一般而言,封裝包括封裝數據和封裝實現

  在許多語言的對象系統中,封裝數據是由語法解析來實現的,這些語言提供了public、private、protected這些關鍵字來限定方法和屬性的可見性,這種限定分類定義了對象用戶所能訪問的層次

  但javascript並沒有提供對這些關鍵字的支持,只能依賴變數的作用域來實現封裝特性, 而且只能模擬出 public 和 private 這兩種封裝性。除了ECMAScript6中提供的let之外,一般通過函數來創建作用域:

var myObject = (function(){
  var  name = 'match';    // 私有(private)變數
  return {
    getName: function(){    // 公開(public)方法
      return  name;
    }
  }
})();
console.log( myObject.getName() );// 輸出:match
console.log( myObject.name )    // 輸出:undefined

  面向對象編程強調的是數據和操作數據的行為本質上是互相關聯的,因此好的設計就是把數據以及和它相關的行為封裝起來。舉例來說,用來表示一個單詞或者短語的一串字元通常被稱為字元串。字元就是數據。但是關心的往往不是數據是什麼,而是可以對數據做什麼,所以可以應用在這種數據上的行為(計算長度、添加數據、搜索等等)都被設計成 String 類的方法。所有字元串都是 String 類的一個實例,也就是說它是一個包裹,包含字元數據和可以應用在數據上的函數

  封裝不僅僅是隱藏數據,還包括隱藏實現細節、設計細節以及隱藏對象的類型等

  從封裝實現細節來講,封裝使得對象內部的變化對其他對象而言是透明的,也就是不可見的。 對象對它自己的行為負責。其他對象或者用戶都不關心它的內部實現。封裝使得對象之間的耦合變鬆散,對象之間只通過暴露的 API 介面來通信。當修改一個對象時,可以隨意地修改它的內部實現,只要對外的介面沒有變化,就不會影響到程式的其他功能

 

聚合

  所謂聚合,有時候也叫做組合,實際上是指將幾個現有對象合併成一個新對象的過程。總之,這個概念強調的是將多個對象合而為一的能力。通過聚合這種強有力的方法,可以將一個問題分解成多個更小的問題。這樣一來,問題就會顯得更易於管理(便於各個擊破)。當一個問題域的太過複雜時,就可以考慮將它分解成若幹個子問題區,並且必要的話,這些問題區還可以再繼續分解成更小的分區。這樣做有利於從幾個不同的抽象層次來考慮這個問題

  類似的情況如Book是由一個或多個author對象,publisher對象、若幹chapter對象以及一組table對象等組合而成的對象

 

繼承

  通過繼承這種方法,可以非常優雅地實現對現有代碼的重用。在傳統的OOP環境中,繼承通常指的是類與類之間的關係,但由於javascript中不存在類,因此它的繼承只能發生在對象之間

  比如,有一個Person的一般性對象,其中包含一些姓名、性別之類的屬性,以及一些功能性函數,如步行、談話、睡覺、吃飯等。然後,需要一個Programmer對象時,可以讓Programmer繼承自Person,Programmer對象只需要實現屬於它自己的那部分特殊功能(如編寫代碼),而其餘部分重用Person的實現即可

  當一個對象繼承自另一個對象時,通常會往其中加入新的方法,以擴展被繼承的老對象。通常將這一過程稱之為“B繼承自A”或“B擴展自A”。另外對於新對象來說,它可以根據自己的需要,從繼承的那組方法中選擇幾個來重新定義。這樣做並不會改變對象的介面,因為其方法名是相同的,只不過當調用新對象時,該方法的行為與之前不同了。這種重定義繼承方法的過程叫做覆寫

 

多態

  多態一詞源於希臘文polymorphism,拆開來看是poly(複數)+morph(形態)+ism,從字面意思可以理解為複數形態

  多態的實際含義是:同一個操作作用於不同的對象上面,可以產生不同的解釋和不同的執行結果。換句話說,給不同的對象發送同一個消息的時候,這些對象會根據這個信息分別給出不同的反饋

  Programmer對象繼承了上一級對象Person的所有方法。這意味著這兩個對象都實現了"talk"等方法。現在,代碼中有一個叫做“Match”的變數,即使是在不知道它是一個Person對象還是一個Programmer對象的情況下,也依然可以直接調用該對象的"talk"方法,而不必擔心這會影響代碼的正常工作。類似這種不同對象通過相同的方法調用來實現各自行為的能力,稱之為多態

  多態背後的思想是將“做什麼”和“誰去做以及怎樣去做”分離開來,也就是將“不變的事物”與“可能改變的事物”分離開來。把不變的部分隔離出來,把可變的部分封裝起來,這給予了我們擴展程式的能力,程式看起來是可生長的,也符合開放——封閉原則,相對於修改代碼來說,僅僅增加代碼就能完成同樣的功能,這顯然優雅和安全得多

  多態最根本的作用是通過把過程化的條件分支語句轉化為對象的多態性,從而消除這些條件分支語句

 

總結

  下麵來對上面提到的概念進行總結

  對象:Match是一個男人(後者是一個對象)

  屬性:Match是男性,黃皮膚,黑頭髮

  方法:Match能吃飯、睡覺、喝水、做夢

  類:Match是Programmer類的一個實例

  原型對象:Match是一個由Programmer對象擴展而來的新對象

  封裝:Match對象包含了數據和基於這些數據的方法

  聚合:Match只是整個Web開發團隊對象的一部分,該團隊還包括一個Designer對象Wang,以及一個ProjectManager對象Li

  繼承:Designer、ProjectManager、Programmer都是分別擴展自Person對象的新對象

  多態:可以隨時調用Match、Wang、Li這三個對象各自的talk方法,它們都可以正常工作,儘管這些方法會產生不同的結果。如Match可能談得更多的是代碼的性能,Wang更傾向於談代碼的優雅性,而Li強調的是最後期限。總之,每個對象都可以重新自定義它們的繼承方法talk

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 設置cookie: ...
  • 上一節看了一眼預編譯的總體代碼,這一節分析convert-argv模塊。 這個模塊主要是對命令參數的解析。 生成預設配置文件名數組 函數內部,首先判斷了argv.d與argv.p屬性是否存在,這個屬性來源於參數d與p,即webpack -d -p,測試如圖: 因為懶得加,所以直接跳過,進入到第二階段 ...
  • 前端體系的變化可謂是日新月異,短短一年時間,從理論、框架、構建工具、甚至開發語言都發生非常大的變化。 隨著新項目就即將啟動,我抽時間回顧了一下以往項目的前端架構,零零散散產生了許多想法,儘量一一記錄下來,為新的框架搭建做點準備。 首先來聊聊CSS的的各種規範與理論。回顧過去的代碼,首先讓我頭痛不已的 ...
  • 頁面中任何一個元素都可以指定為 彈性佈局(Flex) 屬性:display 取值: 1、flex 將塊級元素變為彈性佈局容器 2、inline-flex 將行內元素變為彈性佈局容器 相容性: display:-webkit-flex; 註意:將元素設置為flex後,子元素的 float,clear以 ...
  • 記得剛遇見css的時候,咱像是見了美人兒一樣,簡直是愛不釋手啊,簡簡單單寫幾行算不上代碼的代碼,就能做出這麼漂亮的東西,這也成了咱前端之路的最初動力。然而,隨著項目體量和頁面複雜度的增加,咱很快就發現這美人兒非但不漂亮,而且缺胳膊少腿兒的。 ...
  • 最近在用jQuery實現動態模糊查詢的時候,找了挺久都沒有找到像Vue.js的watch屬性這麼好用的動態模糊查詢方法。就分享一下目前遇到的坑和可以實現動態查詢的幾種方式。 1.jQuery的change()方法。 這個方法要失去所在的input框的焦點時,事件才會被觸發,感覺有點雞肋,也有可能是我 ...
  • 隨著網路的高速發展,網路性能的持續提高成為能否在芸芸App中脫穎而出的關鍵。高度聯結的世界意味著用戶對網路體驗提出了更嚴苛的要求。假如你的網站不能做到快速響應,又或你的App存在延遲,用戶很快就會移情你的競爭對手。以下為大家總結10條有關性能提升的經驗,以供參考: 1. 採用反向代理伺服器(Reve ...
  • JavaScript 三種工廠模式:簡單工廠模式、工廠方法模式、抽象工廠模式。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...