亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

基于原型與基于類的繼承

基于原型與基于類的繼承

江戶川亂折騰 2019-09-18 13:32:48
在JavaScript中,每個對象都是實例和類。要進行繼承,可以使用任何對象實例作為原型。在Python,C ++等中,有類和實例作為單獨的概念。為了進行繼承,您必須使用基類來創建一個新類,然后可以使用它來生成派生實例。為什么JavaScript會朝這個方向發展(基于原型的面向對象)?基于原型的OO相對于傳統的,基于類的OO有哪些優點(和缺點)?
查看完整描述

3 回答

?
DIEA

TA貢獻1820條經驗 獲得超2個贊

這里有大約一百個術語問題,主要是圍繞某人(不是你)試圖讓他們的想法聽起來像The Best。

所有面向對象的語言都需要能夠處理幾個概念:

  1. 封裝數據以及對數據的相關操作,不同地稱為數據成員和成員函數,或者作為數據和方法等。

  2. 繼承,能夠說這些對象就像其他一組對象一樣,除了這些變化之外

  3. 多態(“多種形狀”),其中一個對象自己決定要運行哪些方法,以便您可以依賴語言來正確地路由您的請求。

現在,就比較而言:

首先是整個“階級”與“原型”問題。這個想法最初開始于Simula,其中使用基于類的方法,每個類表示一組共享相同狀態空間(讀取“可能值”)和相同操作的對象,從而形成等價類。如果你回顧一下Smalltalk,因為你可以打開一個類并添加方法,這實際上與你在Javascript中可以做的一樣。

后來的OO語言希望能夠使用靜態類型檢查,因此我們在編譯時得到了固定類集的概念。在開放階段版本中,您具有更大的靈活性; 在較新的版本中,您可以在編譯器上檢查某些類型的正確性,否則需要進行測試。

在“基于類”的語言中,復制發生在編譯時。在原型語言中,操作存儲在原型數據結構中,在運行時復制和修改。但是,抽象地說,類仍然是共享相同狀態空間和方法的所有對象的等價類。當您向原型添加方法時,您將有效地創建新等價類的元素。

現在,為什么這樣做?主要是因為它在運行時創建了一個簡單,合理,優雅的機制?,F在,要創建新對象創建新類,您只需執行深層復制,復制所有數據和原型數據結構。您可以或多或少地免費獲得繼承和多態性:方法查找總是包括通過名稱向字典詢問方法實現。

最終出現在Javascript / ECMA腳本中的原因基本上就是當我們10年前開始使用它時,我們處理的是功能較弱的計算機和不太復雜的瀏覽器。選擇基于原型的方法意味著解釋器可以非常簡單,同時保留面向對象的理想屬性。


查看完整回答
反對 回復 2019-09-18
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

你應該看看Douglas Crockford寫的一本關于JavaScript的好書。它為JavaScript創建者所做的一些設計決策提供了很好的解釋。

JavaScript的一個重要設計方面是其原型繼承系統。對象是JavaScript中的一等公民,以及常規函數也被實現為對象('Function'對象是精確的)。在我看來,當它最初設計為在瀏覽器中運行時,它意味著用于創建大量的單例對象。在瀏覽器DOM中,您可以找到窗口,文檔等所有單例對象。此外,JavaScript是松散類型的動態語言(與強類型的動態語言Python相反),因此,通過使用'prototype'屬性實現了對象擴展的概念。

所以我認為在JavaScript中實現了基于原型的OO的一些優點:

  1. 適用于松散類型的環境,無需定義顯式類型。

  2. 使單例模式變得非常容易(在這方面比較JavaScript和Java,你會知道我在說什么)。

  3. 提供在不同對象的上下文中應用對象的方法,從對象等動態添加和替換方法的方法(在強類型語言中不可能的事情)。

以下是原型OO的一些缺點:

  1. 沒有簡單的方法來實現私有變量。可以使用Crockford的魔法使用閉包來實現私有變量,但它絕對不像在Java或C#中使用私有變量那么簡單。

  2. 我不知道如何在JavaScript中實現多重繼承(其價值)。


查看完整回答
反對 回復 2019-09-18
  • 3 回答
  • 0 關注
  • 493 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號