JS繼承——原型鏈

来源:https://www.cnblogs.com/planetwithpig/archive/2019/09/18/11543320.html
-Advertisement-
Play Games

許多OO語言支持兩種繼承:介面繼承和實現繼承。ECMAScript只支持實現繼承,且繼承實現主要依賴原型鏈實現。 原型鏈 基本思想:利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。 構造函數、原型和實例的關係:每個構造函數均有一個原型對象,原型對象均包含一個指向構造函數的指針,實例均包含一個指 ...


許多OO語言支持兩種繼承:介面繼承實現繼承。ECMAScript只支持實現繼承,且繼承實現主要依賴原型鏈實現。

原型鏈

基本思想:利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。

構造函數、原型和實例的關係:每個構造函數均有一個原型對象,原型對象均包含一個指向構造函數的指針,實例均包含一個指向原型對象的內部指針。若讓原型對象等於另一個類型的實例,此時原型對象將包含一個指向 另一個原型的指針,相應地,另一個原型中也包含一個指向另一個構造函數的指針。若另一個原型又是另一個類型的實例,那麼上述關係依然成立,如此層層遞進,就構成了實例與原型的鏈條。

原型鏈基本模式,示例代碼如下:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title>原型鏈-繼承</title>
 5     <script type="text/javascript">        
 6         function Supertype(){
 7             this.property=true;//propertype屬於Supertype實例屬性
 8         }
 9 
10         Supertype.prototype.getSuperValue=function(){//getSuperValue()屬於原型方法
11             return this.property;
12         };//至此,Supertype原型包含指向Supertype構造函數的constructor屬性和getSuperValue()方法。
13 
14         function Subtype(){
15             this.subproperty=false;//subproperty屬於Subtype實例屬性
16         }
17 
18         //繼承了Supertype,重寫了原型對象
19         Subtype.prototype=new Supertype();
20 
21         //添加新方法
22         Subtype.prototype.getSubValue=function(){//為Subtype原型添加方法getSubValue()
23             return this.subproperty;
24         }//至此,Subtype原型模型中包含屬性和方法為:內部屬性[prototype]、property屬性、getSuperValue()方法。作為一個Supertype類型的實例,其內部屬性[prototype]指向Supertype原型,實例屬性property。
25 
26         //重寫超類中的方法,因此需要謹慎地定義方法
27         Subtype.prototype.getSuperValue=function(){
28             return false;
29         }
30 
31         var instance=new Subtype();//實例內部屬性[prototype]指向Subtype原型;且包含實例屬性subproperty
32         alert(instance.getSuperValue());//在重寫超類函數之前返回true;重寫了超累函數之後返回false
33 
34         //確定原型和實例的關係
35         alert(instance instanceof Object);//true
36         alert(instance instanceof Supertype);//true
37         alert(instance instanceof Subtype);//true
38 
39         alert(Object.prototype.isPrototypeOf(instance));//true
40         alert(Supertype.prototype.isPrototypeOf(instance));//true
41         alert(Subtype.prototype.isPrototypeOf(instance));//true
42     </script>
43 </head>
44 <body>
45 </body>
46 </html>

原型鏈的問題:
(1)原型鏈子類實例共用父類引用類型,同原型模型的問題一樣。

(2)在創建子類的實例時,不能在不影響所有對象實例的情況下,向超類型的構造函數傳遞參數

因此,實踐中很少單獨使用原型鏈。

文章內容部分摘自《JavaScript高級程式設計(第3版)》


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

-Advertisement-
Play Games
更多相關文章
  • 在使用javascript實現基本的數據結構中,練習了好幾周,對基本的數據結構如 棧、隊列、鏈表、集合、哈希表、樹、圖等內容進行了總結並且寫了筆記和代碼。 在 github中可以看到 點擊查看,可以關註一下我哈。 樹的基本術語 二叉樹節點的存儲結構 創建一個二叉搜索樹 二叉樹的先序、中序、後續遍歷算 ...
  • vue 微信頁面添加水印 this.$nextTick(function() { watermark({ watermark_txt: "<div>" + '123' + "</div><div>" + '456' + "</div>"}); }) function watermark(settin ...
  • 昨天讓我做一個功能,實現一個模糊檢索,我就想,那做唄,然後開始正常的開發 代碼如下: HTML VUE 因為是實時的,所以寫了將邏輯寫到了watch中 五分鐘搞定。 我以為這就完了,然而產品的需求是無窮無盡的,敬愛的(我想說啥你懂得)產品經理,看到我做的這麼快果斷加了一波需求。 產品:我覺得你這裡可 ...
  • 帶進度條的App自動更新,效果如下圖所示: 技術:vue、vant-ui、5+ 封裝獨立組件AppProgress.vue: app升級代碼,封裝獨立js文件:appUpdateOptions.js 調用代碼: 結束....... ...
  • [TOC] 1.楔子 需求一: 有html標簽關係如下,請找到所有的含有a標簽的li標簽 原生js實現 jqeury實現 需求二: 將上面的li標簽實現隔行換色效果 原生js實現 原生js實現 jquery實現 儘管,你現在啥也不知道,你就知道用上了jquery咱們寫代碼節省了很多操作,便利了很多就 ...
  • 當我們在src目錄下創建.scss文件,併在main.js中引用,運行時會報: ERROR Failed to compile with 1 errors 5:25:07 PMThis relative module was not found: * ./main.scss in ./src/mai ...
  • 0918自我總結 js獲取時間,迴圈執行任務,延遲執行任務 一.獲取時間 核心方法創建一個時間對象: 時間對象相關操作 .`函數名` | 函數名 | 功能 | | : | : | | getYear() | 獲取四位數的年份 | | getMonth() | 獲取2位數的月數, 這個是從 0 開始的 ...
  • 近期需要在vue3項目上做一個富文本編輯器,找了很多插件組件,最終決定用 froala。雖然不是免費的,但是功能實在是太強大了。 froala 文檔:https://www.froala.com/wysiwyg-editor/docs/overview froala 官方demo: https:// ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...