我知道,這個話題已經被討論過太多次了。但是,它總是被不斷地提及。每當Java或C#或任何其他OOP語言的開發人員與JavaScript接觸時,這些開發人員都會抱怨連連。他們說,用JavaScript工作簡直是一團亂,沒有類型,結構不合理,有些怪異,物件支援不給力,它絕對不是OOP語言。
其中有些抱怨可能可以接受,但有些則是偏見,例如說JavaScript沒有類型因而它不是OOP語言的言論。關於後面一點,在出口論斷之前,你應該問自己:是什麼讓程式語言成為物件導向的程式語言?
什麼是OOP?
OOP模式沒有正式的標準規範。沒有一個技術文件定義了什麼是OOP,什麼不是OOP。 OOP定義主要基於早期研究人員,如Kristen Nygaard, Alan Kays, William Cook等人所發表的論文中的常識。已經有很多人嘗試定義OOP以及一個可廣泛接受的定義來對程式語言進行分類,因為物件導向基於兩個要求:
透過物件建模問題的能力。
支援一些準許模組化和程式碼重用的原則。
為了滿足第一個要求,這種語言必須使開發人員能夠使用物件來描述現實並定義物件之間的關係,如下所示:
關聯:物件引用另一個獨立物件的能力。
聚合:物件嵌入一個或多個獨立物件的能力。
組合:物件嵌入一個或多個依賴物件的能力。
通常,如果語言支援以下原則,則能滿足第二個要求:
封裝:專注於資料和操縱程式碼的單一實體,並隱藏其內部細節的能力。
繼承:一個物件從一個或多個其他物件取得某些或所有要素的機制。
多態:根據資料型別或結構不同地處理物件的能力。
滿足這些要求的語言我們通常將其歸類為物件導向的。
JavaScript和OOP
所以現在我們知道OOP語言應該是什麼樣子的了。那麼,我們可以證明JavaScript是一種OOP語言嗎?咱們試試吧。
我們知道,JavaScript物件支援關聯,聚合和組合的能力並不強勁。請看以下程式碼:
var johnSmith = { firstName: "John", lastName: "Smith", address: { //Composition street: "123 Duncannon Street", city: "London", country: "United Kingdom" } }; var nickSmith = { firstName: "Nick", lastName: "Smith", address: { //Composition street: "321 Oxford Street", city: "London", country: "United Kingdom" } }; johnSmith.parent = nickSmith; //Association var company = { name: "ACME Inc.", employees: [] }; //Aggregation company.employees.push(johnSmith); company.employees.push(nickSmith);
在上面的程式碼中,你可以找到一個組合(address屬性)的範例,一個關聯(parent屬性)的範例和一個聚合(employees屬性)的範例。
至於封裝,JavaScript物件是支援資料和函數的實體,但它們沒有進階的本機支援來隱藏內部細節。 JavaScript物件不關心隱私。如果不謹慎的話,所有的屬性和方法都可以公開存取。但是,我們可以應用若干技術來定義物件的內部狀態,並保護物件以防外部存取:使用getter和setter來利用閉包。
透過所謂的原型繼承,JavaScript在基本層中支援繼承。即使有些開發人員認為它有點簡單,但JavaScript的繼承機制是完全有效的,並且允許你得到與大多數公認的OOP語言相同的結果。任憑你怎麼想,JavaScript有一個機制,透過這個機制“一個物件從一個或多個其他物件獲取一些或所有的功能”,這就是繼承。
有多態性的挑戰似乎更加困難,因為許多人把這個概念與資料類型連結起來。實際上,多態性涉及程式語言的許多方面,並且不僅僅是與OOP語言有關。通常它涉及諸如泛型、重載和結構子類型等條目。所有這些對於一種「簡單」和弱類型的語言——JavaScript——似乎不堪重負。然而事實並非如此:在JavaScript中,我們可以透過若干方式實現不同類型的多態,也許我們在不知不覺中已經做過很多次了。
沒有類別的OOP
「好吧,但話說回來,JavaScript沒有類別。」
許多開發人員認為JavaScript缺乏類別的概念,而沒有將JavaScript視為一種真正的物件導向的語言,因為它不強制符合OOP原則。
但是,我們可以看到,在非正式的定義中,並沒有明確提及類別。誠然,物件需要特性和原理。但類別並非真正的要求,只是有時,類別是抽象具有公共屬性的物件集的簡單方法而已。因此,即使一種語言的支援物件沒有類,它也可以是物件導向的語言,例如JavaScript。
此外,OOP原則的目的旨在得到支持。為了在語言中進行編程,OOP原則不應該是強制規定的。開發人員可以選擇使用允許他建立物件導向程式碼的構造,也可以選擇不使用。許多人批評JavaScript是因為開發人員可以編寫違反OOP原則的程式碼。但這只是程式設計師的選擇,而不是語言的限制。其他的程式語言也會發生這樣的事情,如C ++。
所以,我們可以得出這樣一個結論,缺乏抽象類別並允許開發人員自由使用或不使用支援OOP原理的功能,並非認定JavaScript是OOP語言的真正障礙
以上是JavaScript是OOP語言嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)