JavaScript之繼承的多種方式和優缺點

来源:https://www.cnblogs.com/wuxj/archive/2019/07/15/11189403.html
-Advertisement-
Play Games

本文主要是跟大家分享下JavaScript中繼承的多種方式和優缺點。 1.原型鏈繼承 問題:引用類型的屬性被所有實例共用,舉個例子: 還有個就是在創建 Child 的實例時,不能向Parent傳參。 2. 借用構造函數(經典繼承) 優點: 1)避免了引用類型的屬性被所有實例共用;2)可以在 Chil ...


本文主要是跟大家分享下JavaScript中繼承的多種方式和優缺點。

1.原型鏈繼承

問題:引用類型的屬性被所有實例共用,舉個例子:

 

還有個就是在創建 Child 的實例時,不能向Parent傳參

2. 借用構造函數(經典繼承)

 優點:

1)避免了引用類型的屬性被所有實例共用;
2)可以在 Child 中向 Parent 傳參。舉個例子:

 缺點:方法都在構造函數中定義,每次創建實例都會創建一遍方法。

3. 組合繼承

原型鏈繼承和經典繼承雙劍合璧。

優點:融合原型鏈繼承和構造函數的優點,是 JavaScript 中最常用的繼承模式。

4.原型式繼承

 

就是 ES5 Object.create 的模擬實現,將傳入的對象作為創建的對象的原型。
缺點:包含引用類型的屬性值始終都會共用相應的值,這點跟原型鏈繼承一樣。

註意:修改person1.name的值,person2.name的值並未發生改變,並不是因為person1和person2有獨立的 name 值,而是因為person1.name = ‘person1’,給person1添加了 name 值,並非修改了原型上的 name 值。

5. 寄生式繼承

創建一個僅用於封裝繼承過程的函數,該函數在內部以某種形式來做增強對象,最後返回對象。

缺點:跟借用構造函數模式一樣,每次創建對象都會創建一遍方法。

6. 寄生組合式繼承

為了方便大家閱讀,在這裡重覆一下組合繼承的代碼:

 組合繼承最大的缺點是會調用兩次父構造函數。一次是設置子類型實例的原型的時候:

Child.prototype = new Parent();

一次在創建子類型實例的時候:

var child1 = new Child('kevin', '18');

回想下 new 的模擬實現,其實在這句中,我們會執行:

arent.call(this, name);

在這裡,我們又會調用了一次 Parent 構造函數。所以,在這個例子中,如果我們列印 child1 對象,我們會發現 Child.prototype 和 child1 都有一個屬性為colors,屬性值為[‘red’, ‘blue’, ‘green’]。

那麼我們該如何精益求精,避免這一次重覆調用呢?

如果我們不使用 Child.prototype = new Parent() ,而是間接的讓 Child.prototype 訪問到 Parent.prototype 呢?看看如何實現:

 最後我們封裝一下這個繼承方法:

這種方式的高效率體現它只調用了一次 Parent 構造函數,並且因此避免了在 Parent.prototype 上面創建不必要的、多餘的屬性。與此同時,原型鏈還能保持不變;因此,還能夠正常使用 instanceof 和 isPrototypeOf。開發人員普遍認為寄生組合式繼承是引用類型最理想的繼承範式。




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

-Advertisement-
Play Games
更多相關文章
  • 好一段時間沒寫了,今天寫一下JavaScript的迴圈和輸出吧! 其實JavaScrip的迴圈跟C#、Java的迴圈用法是相同的。 先在說一下輸出語句! JavaScript 可以通過不同的方式來輸出數據: 使用 window.alert() 彈出警告框。 使用 document.write() 方 ...
  • nodejs進階教程,小白繞道!!! npm使用技巧和最佳實踐 前提:請確保全裝了node.js npm的最佳實踐 npm install是最常見的npm cli命令,但是它還有更多能力!接下來你會瞭解npm是如何在應用的整個生命周期幫助你的-從創建一個項目到開發和部署整個生命周期 認識npm 在開 ...
  • HTML是web前端開發基礎,關於HTML,這裡有幾個很重要的知識點,在日常開發常常用到,並且在大家面試的時候也會問的,記住這7個重要知識點,助你在面試時優先錄用。 1、網頁結構 網頁結構一般都包含文檔聲明DOCTYPE,並且在head中的meta應該包含編碼格式、關鍵字、網頁描述信息。簡單格式如下 ...
  • 在做網頁時,常常使用彈窗,以上就是瀏覽器的三種彈窗方式, 1: alert 在測試時常用 2: confirm 可以套用if...else 來用 ,比如 :confirm點擊了確定做什麼事情,點擊了取消又做什麼事情 3: prompt 彈窗輸入 ; 可以給網頁設置密碼。 以上是我個人對三種彈窗的見解 ...
  • 在HTML中<img>這個標簽是定義文本中的圖片標簽,它的作用就比如說可以提供圖片的名字、提供圖片的尺寸大小和提供圖片的一些圖片屬性,比如Alt這個屬性,可以給圖片一個名稱來告訴朋友們。這個也是對seo優化的一種細節上的方式。這樣做可以讓百度蜘蛛可以知道你這個圖片是個什麼東西,或者說,當你發佈這個圖 ...
  • 1. uniapp之w picker使用採坑 1.1. 前言 由於我是先在index頁面集合了這個組件,發現該文件內容實在太多了,不好維護,所以打算把內容一個個抽成組件,在抽w picker時,遇到了兩個問題 1. 點擊取消,會調用方法,但不會產生取消隱藏效果,點擊確認也一樣,確認函數的確調用了,但 ...
  • D3.js 簡介D3 的全稱是(Data-Driven Documents),顧名思義可以知道是一個被數據驅動的文檔。聽名字有點抽象,說簡單一點,其實就是一個 JavaScript 的函數庫,使用它主要是用來做數據可視化的。 D3的特點是通過JavaScript代碼實現svg圖標。 D3圖表和Thi ...
  • 前導知識 1. 大多數開發者在使用Java或C 等基於類的語言的過程中學會了面向對象編程。由於JavaScript沒有對類的正式支持,這些開發者在學習JavaScript時往往會迷失方向; 2. JavaScript不需要在開頭就定義好各種類,你可以在寫代碼的過程中根據需要創建數據結構 ; 3. 由 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...