是時候讓 JavaScript 面向對象了!

2022-02-03 傳智匯

本文轉自公眾號CSDN(ID:CSDNnews)

作者:Dechalert

「經驗豐富的後臺開發總是瞧不上前端的技術,尤其是 JavaScript,一直被當作不入流的語言」,雖然在幾十年前,JavaScript 只能開發非常小且功能單一的應用程式,但如今無論是前端還是後端,JavaScript 在規模和複雜性方面都取得了很大的發展。而 JavaScript 中的面向對象則有助於減輕心理負擔,並避免基於函數的編程中固有的紛雜的關係。

是時候做出改變了!

以下為譯文:

經驗豐富的後臺開發總是瞧不上前端的技術,尤其是 JavaScript,一直被當作不入流的語言。主要是因為起初 JavaScript 是基於功能的語言,導致其潛在的發展方式和內容方面不成熟。

我記得早在 90 年代末和 21 世紀初,JavaScript 主要用於製作動態的 HTML 頁面,偶爾用來添加一些視覺上的功能。

如今,整個框架、庫甚至後臺的系統都可以在 JavaScript 上運行。以前使用 JavaScript 開發原生移動和桌面應用程式是駭人聽聞的事兒,可如今這種做法很常見,甚至比 Java 還流行,而且 JavaScript 也完全支持跨平臺。

現在,JavaScript 無處不在。你可以輕鬆搞定 JavaScript,而且也非常實用。但是從長期來看這很可能造成很多問題。許多 JavaScript 程式設計師都沒有接受過面向對象編程方法的培訓。當然,這也不是他們的錯。有時候我們只會學習工作中用得到的東西,還有的時候連我們自己都不清楚我們缺乏哪方面的知識。

面向對象編程的基本思路完全不同。其背後的思想是:你將所需要做的功能抽象成一個「對象」,然後一遍遍地調用這個對象來完成你想要的功能。

每次調用對象時,你必須創建對象,確保對象的存在,然後為了使用對象所帶的功能你需要設置它的屬性,這些功能稱為「方法(methods)」。

例如,客戶訂單的對象可能含有訂單詳細信息的功能(也稱為方法)。

用 JavaScript 編寫的客戶訂單類的示例以及用法

在基於函數的結構中,你需要將向函數傳遞參數才能調用函數。你需要拿到一個訂單號(Order ID)然後傳遞給函數。

用 JavaScript 編寫的函數示例

這裡的問題在於:如果你想擴展上述函數,那麼很快就會變得很混亂。雖然最初將所有的功能都寫成函數,並在需要的時候調用似乎很簡單,但是這種做法缺少範圍定義,很容易引發一連串的問題,影響到許多未知但相互關聯的關係。然而,類可以防止這種情況。

類的概念

上圖中的構造函數(constructor )用來設置變量。Getter 和 Setter 方法是某些操作的入口。這些函數調用了什麼、怎樣調用的都被隱藏了。每次創建新對象時,都會「克隆」整個類及其方法,然後創建者就能訪問該對象了,如此一來變更的範圍就明確了,而且我們知道,任何對於類及其方法的更改都是一致的。

義大利麵條式代碼(spaghetti code)的開端

如果我們使用一堆鬆散的函數寫代碼,那麼通常都不會定義更改範圍。我們需要傳遞參數才能調用函數,而且往往一個函數需要依賴另一個函數。從表面上看,基於函數的編程起初似乎很容易,但從長遠來看,維護起來簡直就是一場噩夢。

使用面向對象編程時,你只需調用 Getter 和Setter 方法即可訪問黑盒功能。作為類的消費者,你不需要知道其中的工作原理,你只需要它的用法。

為什麼我們需要在 JavaScript 中實現 OOP?

當有太多東西交織在一起時,就會出現我們常說的義大利麵條式代碼。基於函數的編程(就像最初的 JavaScript)可以快速編寫代碼,但從長遠來看,這種方法最終會在應用程式中埋下很多風險和 bug。

隨著代碼庫的增長,你需要改變你組織思路的方法,並開始用面向對象的方式思考。與一系列相互糾纏需要通過一系列的參數傳遞才能運行的函數相比,對象的範圍很容易控制和追蹤。

現實生活中義大利麵條式代碼的開端。為了搞清楚如何才能實現你的目標,你需要了解一系列的函數。如果你需要多次重複整個過程,那麼就必須不斷重複理解。

基於函數編程的問題在於,一旦有一個函數出現問題,就會導致整個鏈上的流程失敗。而對於對象而言,一個方法出問題不會(也不應該)影響到其他類。

面向對象最初看起來會有很多代碼,但是你可以重用,而無需為每個實例編寫冗長的函數鏈,如最後的日誌輸出的部分所示。

與一連串的函數相比,面向對象的思考方式可以在發生故障時降低失敗的風險和範圍。這是因為函數間的互相調用都會埋下執行失敗的風險。追蹤一系列函數不僅耗費時間成本,而且同樣的工作重複十幾次的話,時間和心理的壓力都會很大。

我總認為,面向對象編程在決定代碼所涉及的範圍上有主動權。(如果你想用 Angular 實現面向對象,那麼需要全面了解這個框架。)

總的來說,JavaScript 中的面向對象可以減輕心理負擔,並避免基於函數的編程中固有的紛雜的關係。雖然在幾十年前,JavaScript 只能開發非常小且功能單一的應用程式,但如今無論是前端還是後端,JavaScript 在規模和複雜性方面都取得了很大的發展。

歸根結底,所有代碼都一樣——只是組織方式不同罷了。面向對象的範式是對函數編程反思後的解決方案,因為函數編程造成的心理負荷通常比基於類的結構更大。如果代碼結構易於理解和追蹤,那麼就可以減少出錯的可能性,在添加新功能時也不會破壞周圍的其他功能。

本文轉自公眾號CSDN(ID:CSDNnews

原文:https://itnext.io/its-time-we-talk-about-object-oriented-javascript-81b4b9b70981

相關焦點

  • JavaScript 的函數式編程與面向對象編程區別在哪?
    本文通過代碼來看一看JavaScript中函數式編程和面向對象編程的差異。
  • JavaScript - Math對象
    Math對象在我們js中其實是有很多數學計算的需求的,不過不必擔心系統給我們提供了大量的數學運算的方法供我們使用而這些方法全都存在於我們的Math對象中Math常用的屬性:Math.PI 相當於π 3.14159Math對象常用的函數
  • JavaScript Window Location 對象介紹 | JavaScript 教程
    window.location 對象用於獲得當前頁面的地址 (URL),並把瀏覽器重定向到新的頁面。
  • JavaScript中幾乎一切都是對象:創建對象的三種方式
    本文將教你使用JavaScript創建對象的三種方法。JavaScript對象字面量是指用大括號括起來的用逗號分隔的名稱——值對列表。對象字面量用於封裝代碼並將其包裝在有序的包中。仔細想,其實它們本身已經是對象了,因此對象用於創建更多對象。通常,此方法優於對象構造函數。試想必須創建數百個具有相同屬性的對象,使用對象構造函數方法,必須手動將所有屬性添加到所有對象,但是使用構造函數可以預定義這些屬性。
  • JavaScript的DOM對象
    </p></noscript>全局DOM對象window對象的方法setInterval,setTimeout,clearInterval,clearTimeoutopen(URL,name,options)close()resizedBy(dw,dh)resizeTo(width,height)scrollBy(dx,dy)
  • JavaScript面向對象精要
    實質是指向內存位置的引用,所以不在變量中保存對象。,其類型為構造函數類型,指向對象實例;缺少new關鍵字,this指向全局對象。可以用instanceof來檢測對象類型,同時每個對象在創建時都自動擁有一個constructor屬性,指向其構造函數(字面量形式或Object構造函數創建的對象,指向Object,自定義構造函數創建的對象則指向它的構造函數)。
  • 面向對象聖經
    上帝告訴Dennis Ritchie:「找個數據結構把參數組織起來,以後就傳遞這個數據結構!」上帝說:「要有Class!把這些重複的方法代碼從對象中剝離出來,放到一個公共的Class中!人類在寫push()函數,pop()函數的時候,要操作Object的數據, 到底操作的是哪一個Object?上帝說:「 要有this !」每次調用函數的時候,可以把要操作的Object作為一個隱藏的參數傳遞進去。例如void push(int data),真正在調用的時候是這樣的:void push(Stack this, int data)。
  • 全新java大數據教程之JavaScript的DOM對象(Document Object Model 文檔對象模型)
    DOM即文檔對象模型描繪了一個層次化的節點樹,運行開發人員添加、移除和修改頁面的某一部分。dom 處於javascript 的核心地位上。每個載入瀏覽器的 HTML 文檔都會成為 Document 對象。Document 對象使我們可以從腳本中對 HTML 頁面中的所有元素進行訪問。
  • JavaScript:對象都是這樣生成的!
    來源 | 程序那些事(ID:flydean-tech)本文將會深入講解面向對象在 javas雖然說程式設計師不缺對象,隨時隨地都可以 new 一個出來,但是在程序的世界中,對象到底是什麼呢?對象是單個實物的抽象。對象是一個容器,封裝了屬性(property)和方法(method)。而面向對象是相對於面向過程來講的。
  • JavaScript是什麼
    javaScript----是一種面向對象的腳本語言。面向對象是一種編程思想,看不見摸不著,只能體會,用實際行動來證明。面向對象這種編程思想是對面向過程的思想的升華。面向過程的思想面向過程的思想就是需要將沿途經過的地方保存下來,這些地方連接在一起就形成了過程。
  • 再見了,面向對象的編程
    面向對象的語言並沒有讓包含和代理功能簡單易行。它們被設計為讓繼承簡單易行。如果你是我,你也開始對這個繼承存疑了。但更重要的是,這應該動搖你通過分層化分類的信心。每次在新公司開始工作的時候,當我尋找一個地方存放公司文檔(例如員工手冊)時我會遇上一個問題。我是創建一個叫文檔的文件夾然後在其中創建一個叫公司的文件夾呢?
  • C++ 面向對象
    今天就來解析一下c++面對對象。Dialog();  private slots: void on_horizontalSlider_actionTriggered(int action); void on_changeColor(int value); private:    Ui::Dialog *ui;  };#endif 解析上面的代碼,這樣可以深入裡理解c++面向對象的過程
  • Java與JavaScript的區別
    Java有許多值得稱道的優點,如簡單、面向對象、分布式、解釋性、可靠、安全、結構中立性、可移植性、高性能、多線程、動態性等。Java擯棄了C++中各種弊大於利的功能和許多很少用到的功能。 Jave可以運行與任何微處理器,用Java開發的程序可以在網絡上傳輸,並運行於任何客戶機上。
  • 最強大、最牛逼的javascript視頻
    函數(【六】執行環境和作用域鏈概念)16_尚學堂科技_javascript視頻教程_白賀翔_函數(【七】垃圾收集和塊級作用域的概念)17_尚學堂科技_javascript視頻教程_白賀翔_函數(【八】閉包)18_尚學堂科技_javascript視頻教程_白賀翔_面向對象程序設計(對象【一】類的創建於實例對象)19_尚學堂科技_javascript
  • TIA Portal面向對象編程入門
    儘管時至今日依然有少數人質疑面向對象的編程思想,但我們看到的是面向對象技術發展的越來越好,無論是後端語言(JAVA、C#)或者前端語言(JavaScript、TypeScript),無一不是完全的支持面向對象技術。現在高校的PLC教材基本上採用的還是五六十年前的編程理念,將PLC定位為傳統繼電器控制的替代,以軟元件、寄存器這種古老落後的概念來講授這一門日新月異的現代工業控制編程技術。
  • python 面向對象_2
    get方法上加裝飾器@property第二步:賦值的時候在原get方法基礎上加裝飾器例如get方法是age,就得加@age.setter一個簡單例子將兩個類關聯起來使用)stu.show_book()print('添加書籍')book1 = Book('顯微鏡下的大明', '馬伯庸', 8)stu.borrow_book(book1)print('查看書籍列表-')stu.show_book()查看書籍列表蘇東坡新傳添加書籍書名:顯微鏡下的大明 查看書籍列表蘇東坡新傳顯微鏡下的大明面向對象裡
  • golang 面向對象分析
    說道面向對象(OOP)編程, 就不得不提到下面幾個概念: 抽象, 封裝, 繼承, 多態其實有個問題Is Go An Object Oriented Language?, 隨便谷歌了一下, 你就發現討論這個的文章有很多:那麼問題來了由於之前是寫 C++, 但是說到 Go 面向對象編程, 總是感覺怪怪的, 總感覺缺少點什麼. 我搜集了一些資料和例子, 加上我的一些理解, 整理出這樣一篇文章.一.
  • javascript簡介及基本語法
    一、javascript的簡介* 是基於對象和事件驅動的語言,應用於客戶端。    - 基於對象:         提供好了很多對象,可以直接拿過來使用    - 事件驅動:        html做網站靜態效果,javascript動態效果    - 客戶端:專門指的是瀏覽器* js的特點    (1)交互性
  • DDD 就是把面向對象做好
    充血模型、貧血模型面向對象在處理對象的存儲時,有兩種風格一直爭論不斷。將業務邏輯放到領域對象中,對象不僅需要承載數據也需要承載行為,這種編程邏輯被稱作充血模型。面向對象開發的早期就是充血模型,當我們接觸面向對象的第一堂課時,老師都是拿現實世界中事物作為例子。
  • 【JavaScript 教程】面向對象編程——嚴格模式
    3.3、禁止擴展的對象不可擴展嚴格模式下,對禁止擴展的對象添加新屬性,會報錯。4.2、禁止 this 關鍵字指向全局對象正常模式下,函數內部的this可能會指向全局對象,嚴格模式禁止這種用法,避免無意間創造全局變量。