JavaScript繼承 寄生組合式繼承 extends

JavaScript繼承

1、JS 的繼承到底有多少種實現方式呢?
2、ES6 的 extends 關鍵字是用哪種繼承方式實現的呢?
在這里插入圖片描述

繼承種類

原型鏈繼承

function Parent1() {this.name = 'parentl'this.play = [1, 2, 3]
}function Child1() {this.type = 'child2'
}Child1.prototype = new Parent1();
console.log(new Child1());let child1 = new Child1();
child1.play.push(4)
let child2 = new Child1();
console.log(child1.play,child2.play)

輸出:

Parent1 { type: 'child2' }   
[ 1, 2, 3, 4 ] [ 1, 2, 3, 4 ]

特點
父類內存空間是共享的,當一個發生變化的時候,另外一個也隨之進行了變化。

構造函數繼承(借助 call)

function Parent1() {this.name = 'parent'
}Parent1.prototype.getName = function () {return this.name;
}function Child1() {Parent1.call(this);this.type = 'child1'
}let child = new Child1();
console.log(child);
console.log(child.getName())

輸出

Child1 { name: 'parent', type: 'child1' }
C:\Users\liyd\WebstormProjects\test\dataConvert.js:16                                  
console.log(child.getName())                                                           ^                                                                    TypeError: child.getName is not a function    

缺點:
只能繼承父類的實例屬性和方法。不能繼承原型屬性和方法。

組合繼承方式(推薦)

function Parent3() {this.name = 'parent3'this.play =[1,2,3]
}Parent3.prototype.getName = function () {return this.name;
}function Child3() {Parent3.call(this);this.type = 'child6'
}
// 第一次調用Parent3
Child3.prototype = new Parent3()
// 手動掛上構造器,指向自己的構造函數
Child3.prototype.constructor = Child3var child3 = new Child3();
var child4 = new Child3();
child3.play.push(4)
console.log(child3.play,child4.play)
console.log(child3.getName())
console.log(child4.getName())

輸出:

[ 1, 2, 3, 4 ] [ 1, 2, 3 ]
parent3                   
parent3   

原型式繼承

let parent4 = {name:"parent4",friends:["p1","p2","p3"],getName:function () {return this.name}
}let person4 = Object.create(parent4)
person4.name = "tom"
person4.friends.push("無始")let person5 = Object.create(parent4);
person5.friends.push("狂蟒")console.log(person4.name)
console.log(person4.name === person4.getName())
console.log(person5.name)
console.log(person4.friends)
console.log(person5.friends)

輸出:

tom                                 
true                                
parent4                             
[ 'p1', 'p2', 'p3', '無始', '狂蟒' ]
[ 'p1', 'p2', 'p3', '無始', '狂蟒' ]

寄生式繼承

使用原型式繼承可以獲得一份目標對象的淺拷貝然后利用這個淺拷貝的能力再進行增強添加一些方法

  • 寄生式繼承相比于原型式繼承還是在父類基礎上添加了更多的方法
let parent5 = {name:"parent5",friends:["p1","p2","p3"],getName:function () {return this.name}
}function clone(original) {let clone = Object.create(original)clone.getFriends = function (){return this.friends}return clone
}let person5 = clone(parent5);
let person6 = clone(parent5);
person5.friends.push("666")
console.log(person5.getName())
console.log(person5.getFriends())
console.log(person6.getName())
console.log(person6.getFriends())let person5 = clone(parent5);
console.log(person5.getName())
console.log(person5.getFriends())

輸出:

parent5                    
[ 'p1', 'p2', 'p3', '666' ]
parent5                    
[ 'p1', 'p2', 'p3', '666' ]

寄生組合式繼承(強烈推薦)

在前面這幾種繼承方式的優缺點基礎上進行改造得出了寄生組合式的繼承方式
這也是所有繼承方式里面相對最優的繼承方式

function clone(parent, child) {// 這里改用 Object.create 就可以減少組合繼承中多進行一次構造的過程child.prototype = Object.create(parent.prototype)child.prototype.constructor = child
}function Parent6(){this.name = "parent6"this.play = [1,2,3]
}Parent6.prototype.getName = function () {return this.name
}function Child(){Parent6.call(this)this.friends = 'child6'
}clone(Parent6,Child)Child.prototype.getFriends = function () {return this.friends
}let person6 = new Child()
console.log(person6)
console.log(person6.getName())
console.log(person6.getFriends())

輸出:

Child { name: 'parent6', play: [ 1, 2, 3 ], friends: 'child6' }
parent6                                                        
child6  

總結

在這里插入圖片描述

extends 實現繼承(超推薦 ES6)

語法糖

class Person{constructor(name) {this.name = name}getName = function () {console.log('Person:',this.name)return this.name}
}class Gamer extends Person{constructor(name,age) {super(name);this.age = age}
}let gamer = new Gamer("無始無終",26);
console.log(gamer.getName())

輸出:

Person: 無始無終
無始無終 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714727.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714727.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714727.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

三天學會阿里分布式事務框架Seata-seata事務日志mysql持久化配置

鋒哥原創的分布式事務框架Seata視頻教程: 實戰阿里分布式事務框架Seata視頻教程(無廢話,通俗易懂版)_嗶哩嗶哩_bilibili實戰阿里分布式事務框架Seata視頻教程(無廢話,通俗易懂版)共計10條視頻&…

navicat16

Navicat16: 鏈接: https://pan.baidu.com/s/1vIfX0qEEL4mhBrsEzD_-lw?pwdy3fi 提取碼: y3fi 破解教程視頻:2023年Navicat16破解教程(小白教程)_嗶哩嗶哩_bilibili

1、云原生安全之K8S的部署與常用命令

文章目錄 1、常用命令1.1、基本信息查看1.2、日志查看與問題排查1.3、進入pod與pod內部文件導出1.4、環境搭建相關1.5、鏡像相關1.6、電腦重啟后,重啟k8s服務1.7、關于k8s的持久卷二、k8s的部署2.1、配置環境2.1.1、安裝所需工具2.1.2、修改主機名2.1.3、編輯hosts2.1.4、其他…

第13集《靈峰宗論導讀》

《靈峰宗論》導讀。諸位法師,諸位同學,阿彌陀佛!(阿彌陀佛!) 請大家打開講義第38面。 丙三、結示 這一科是《正見篇》的結示。《正見篇》主要的是要引導我們能夠正確地觀察生命的真相。生命的真相就是說…

【RISC-V 指令集】RISC-V DSP 擴展指令集介紹(二)

前言: 本筆記是基于對RISC-V DSP擴展指令集文檔總結的,《P-ext-proposal.pdf》文檔的關鍵內容如下: 主要介紹了RISC-V的P擴展指令集及其相關細節。 首先,對P擴展指令進行了概述,并列出了其與其他擴展重復的指令。 …

Java 的notify 可能導致死鎖原因詳解

假設有一個共享資源庫 ResourcePool,它內部維護了兩類資源:ResourceTypeA 和 ResourceTypeB。現在有兩個線程 Thread1 和 Thread2,它們都需要從資源庫中分別獲取一種資源才能繼續執行。Thread1 需要 ResourceTypeA 而 Thread2 需要 ResourceT…

上位機圖像處理和嵌入式模塊部署(當前機器視覺新形態)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】 過去的機器視覺處理,大部分都是集中在上位機、或者是服務器領域,這種形式維持了很長的時間。這種業務形態下,無…

windows 11 藍牙突然消失

解決方法: 1.WinX,點擊設備管理器 2.選中藍牙,右鍵更新驅動。 3.然后就可以出現了,如下圖

Django多個app配置多個域名訪問

環境:Python 3.8.1 Django 2.2.12 項目目錄結構: CellMiddle -- 項目根目錄 ├─task --- 需求系統 │ ├─migrations │ ├─static │ └─templates ├─logs --- 日志目錄 ├─doc --- 文檔系統 │ ├─data │ ├─migrations │ ├─st…

程序員是如何看待“祖傳代碼”的?

目錄 ?編輯 程序員是如何看待“祖傳代碼”的? 一、什么是“祖傳代碼”? 二、“祖傳代碼”的利弊 1. 可以節省開發成本 2. 可能引入安全隱患 3. 可能增加系統的維護難度 三、祖傳代對程序員的影響 1. 豐富程序員的技能和知識 2. 提高程序員的創…

python筆記_進制

二進制 進位規則:滿2進1 范圍:0,1 符號:以0b和0B開頭 八進制 進位規則:滿8進1 范圍:0-7 符號:以0o和0O開頭 十進制 進位規則:滿10進1 范圍:0-9 十六進制 進位規則&#xff…

Python——Tchisla求解器(暴力搜索法)

Tchisla簡介 最近玩到一個挺有意思的數字解密小游戲《Tchisla》,其規則類似算24點,也是利用一些數學運算和初始數字計算出目標數字,與算24點不同的是,Tchisla允許不限次數地使用一種初始數字(1~9)&#xf…

【VSCODE修改代碼行間距】解決方案

在我們編碼的過程中,由于顯示字體和顯示器的不同,會需要調整行間距,在vscode默認的選項中沒有看到設定行間距的選項,不過,可以手動修改配置檔達到目的。 1.打開設置 2.打開配置檔,手動進行設定 3.在選項中添…

第七十二天 漏洞發現-Web框架中間件聯動GobyAfrogXrayAwvsVulmap

第72天 漏洞發現-Web框架中間件&聯動&Goby&Afrog&Xray&Awvs&Vulmap 知識點: 1、Bup簡單介紹&使用說明 2、Xray簡單介紹&使用說明 3、AWWS簡單介紹&使用說明 4、Goby簡單介紹&使用說明 5、Afrog簡單介紹&使用說明 6、…

帶你玩轉java封裝和繼承(上)

上次帶大家學習了java里面比較重要的知識點類和對象,而且我們知道java是一門面向對象的語言,有時一個程序里可能有很多類,那么這么多類他們之間有什么聯系嗎?今天就帶大家學習一下java類之間的關系。 什么是繼承: 我們…

Linux信號【systemV】

目錄 前言 正文: 1消息隊列 1.1什么是消息隊列? 1.2消息隊列的數據結構 1.3消息隊列的相關接口 1.3.1創建 1.3.2釋放 1.3.3發送 1.3.4接收 1.4消息隊列補充 2.信號量 2.1什么是信號量 2.2互斥相關概念 2.3信號量的數據結構 2.4…

lambda表達式 —— 過濾再排序未生效問題排查

背景 項目中有個場景&#xff0c;需要將一個列表先按要求過濾&#xff0c;再根據某字段排序。圖方便使用lambda表達式修改原列表將過濾和排序邏輯寫到一行&#xff0c;打印輸出列表發現過濾未生效。 代碼示例&#xff1a; List<Long> productIdList Arrays.asList(1L);…

向爬蟲而生---Redis 探究篇4<Redis主從復制(1)>

前言: 當涉及到Redis的高可用性和數據冗余時&#xff0c;主從復制是一個非常重要的概念。 在現代應用程序的開發中&#xff0c;數據的可靠性和高可用性是至關重要的。當涉及到數據冗余和故障恢復時&#xff0c;Redis主從復制成為一個必不可少的工具和技術。Redis主從復制是一…

藍橋杯-單片機組基礎5——外部中斷與LED的控制(附小蜜蜂課程代碼)

藍橋杯單片機組備賽指南請查看這篇文章&#xff1a;戳此跳轉藍橋杯備賽指南文章 本文章針對藍橋杯-單片機組比賽開發板所寫&#xff0c;代碼可直接在比賽開發板上使用。 型號&#xff1a;國信天長4T開發板&#xff08;綠板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K6…

自學軟件測試怎么學?

軟件測試是一個變得越來越受歡迎的行業&#xff0c;在IT行業里面&#xff0c;也是初學比較容易的。但對小白而言&#xff0c;怎樣學習才能做到快速入門&#xff0c;少走彎路呢&#xff1f; 步驟一&#xff1a;初學學軟件測試&#xff0c;要先搞懂這種問題 要想進入到軟件測試…