3 回答

TA貢獻1820條經驗 獲得超2個贊
這里有大約一百個術語問題,主要是圍繞某人(不是你)試圖讓他們的想法聽起來像The Best。
所有面向對象的語言都需要能夠處理幾個概念:
封裝數據以及對數據的相關操作,不同地稱為數據成員和成員函數,或者作為數據和方法等。
繼承,能夠說這些對象就像其他一組對象一樣,除了這些變化之外
多態(“多種形狀”),其中一個對象自己決定要運行哪些方法,以便您可以依賴語言來正確地路由您的請求。
現在,就比較而言:
首先是整個“階級”與“原型”問題。這個想法最初開始于Simula,其中使用基于類的方法,每個類表示一組共享相同狀態空間(讀取“可能值”)和相同操作的對象,從而形成等價類。如果你回顧一下Smalltalk,因為你可以打開一個類并添加方法,這實際上與你在Javascript中可以做的一樣。
后來的OO語言希望能夠使用靜態類型檢查,因此我們在編譯時得到了固定類集的概念。在開放階段版本中,您具有更大的靈活性; 在較新的版本中,您可以在編譯器上檢查某些類型的正確性,否則需要進行測試。
在“基于類”的語言中,復制發生在編譯時。在原型語言中,操作存儲在原型數據結構中,在運行時復制和修改。但是,抽象地說,類仍然是共享相同狀態空間和方法的所有對象的等價類。當您向原型添加方法時,您將有效地創建新等價類的元素。
現在,為什么這樣做?主要是因為它在運行時創建了一個簡單,合理,優雅的機制?,F在,要創建新對象或創建新類,您只需執行深層復制,復制所有數據和原型數據結構。您可以或多或少地免費獲得繼承和多態性:方法查找總是包括通過名稱向字典詢問方法實現。
最終出現在Javascript / ECMA腳本中的原因基本上就是當我們10年前開始使用它時,我們處理的是功能較弱的計算機和不太復雜的瀏覽器。選擇基于原型的方法意味著解釋器可以非常簡單,同時保留面向對象的理想屬性。

TA貢獻1847條經驗 獲得超11個贊
你應該看看Douglas Crockford寫的一本關于JavaScript的好書。它為JavaScript創建者所做的一些設計決策提供了很好的解釋。
JavaScript的一個重要設計方面是其原型繼承系統。對象是JavaScript中的一等公民,以及常規函數也被實現為對象('Function'對象是精確的)。在我看來,當它最初設計為在瀏覽器中運行時,它意味著用于創建大量的單例對象。在瀏覽器DOM中,您可以找到窗口,文檔等所有單例對象。此外,JavaScript是松散類型的動態語言(與強類型的動態語言Python相反),因此,通過使用'prototype'屬性實現了對象擴展的概念。
所以我認為在JavaScript中實現了基于原型的OO的一些優點:
適用于松散類型的環境,無需定義顯式類型。
使單例模式變得非常容易(在這方面比較JavaScript和Java,你會知道我在說什么)。
提供在不同對象的上下文中應用對象的方法,從對象等動態添加和替換方法的方法(在強類型語言中不可能的事情)。
以下是原型OO的一些缺點:
沒有簡單的方法來實現私有變量。可以使用Crockford的魔法使用閉包來實現私有變量,但它絕對不像在Java或C#中使用私有變量那么簡單。
我不知道如何在JavaScript中實現多重繼承(其價值)。
添加回答
舉報