ES6中class的繼承

来源:https://www.cnblogs.com/chenyingying0/archive/2020/03/27/12584662.html
-Advertisement-
Play Games

ES6中class的繼承 父類(基類) 子類 extends 關鍵字 //父類 class Human{ //父類的構造函數 constructor(name,age,sex,hobby){ this.name=name this.age=age this.sex=sex this.hobby=ho ...


ES6中class的繼承

父類(基類)

子類

extends 關鍵字

//父類
class Human{
    //父類的構造函數
    constructor(name,age,sex,hobby){
        this.name=name
        this.age=age
        this.sex=sex
        this.hobby=hobby
    }

    desc(){
        const {name,age,sex,hobby}=this
        console.log(`我的名字是${ name },我今年${ age }歲,我的性別是:${ sex },我的愛好是:${ hobby }`)
    }

    eat(){
        console.log("吧唧吧唧")
    }
}

//子類 前端工程師類
class FEEnginner extends Human{
    constructor(name,age,sex,hobby,skill,salary){
        super(name,age,sex,hobby)//在this之前調用super,實際上就是調用父類的構造函數
        this.skill=skill
        this.salary=salary
    }

    say(){
        console.log(this.skill.join(","))
    }
}

const feer=new FEEnginner(
    "cyy",
    18,
    "女",
    "study",
    ["es6","vue","react"],
    "1k"
    )
console.log(feer)

//調用父類的方法
feer.desc()
//調用子類自己的方法
feer.say()

 

 

模擬網游的職業系統
父類:代表一個角色
子類:代表一個具有職業的角色

class Character{
    //父類的構造函數
    constructor(name,sex){
        this.name=name
        this.sex=sex
        this.skill=[]//技能
    }
}

//子類 巫師類
class Wizard extends Character{
    constructor(name,sex){
        super(name,sex)//在this之前調用super,實際上就是調用父類的構造函數
        this.initSkill()
    }

    //初始化技能
    initSkill(){
        this.skill=[
            {
                name:"阿瓦達索命",
                mp:666,
                level:999
            },
            {
                name:"守護神咒",
                mp:333,
                level:888
            }
        ]
    }
}

 

super關鍵字的其他內容

super
1、作為父類構造函數調用
2、作為對象的方式調用

第一種方式,上面已經演示過了

第二種方式,又可以分為兩種:

1、非靜態方法中訪問super -> 父類原型
2.靜態方法中訪問super -> 父類
在調用super時,父類的this始終是子類的this

//super 作為對象的方式調用

//父類
class Human{
    //父類的構造函數
    constructor(name,age,sex,hobby){
        this.name=name
        this.age=age
        this.sex=sex
        this.hobby=hobby
    }

    desc(){
        const {name,age,sex,hobby}=this
        console.log(`我的名字是${ name },我今年${ age }歲,我的性別是:${ sex },我的愛好是:${ hobby }`)
    }

    eat(){
        console.log("吧唧吧唧")
    }

    checkThis(_this){
        console.log(_this===this)//this是父類的this,_this是子類傳遞過來的子類的this
    }

}

//靜態屬性
Human.total=10000

//子類 前端工程師類
class FEEnginner extends Human{
    constructor(name,age,sex,hobby,skill,salary){
        super(name,age,sex,hobby)//在this之前調用super,實際上就是調用父類的構造函數
        this.skill=skill
        this.salary=salary
    }

    say(){
        //非靜態方法中訪問super -> 父類原型
        //console.log(super)//這樣會報錯
        console.log(super.eat)//這樣會報錯
        super.eat()
        // true 在調用super時,父類的this始終是子類的this
        super.checkThis(this)//將子類的this傳遞過去
    }    

    static test(){
        //靜態方法中訪問super -> 父類
        console.log(super.name)//Human
        console.log(super.total)//10000
    }
}

const feer=new FEEnginner(
    "cyy",
    18,
    "女",
    "study",
    ["es6","vue","react"],
    "1k"
    )

//調用子類自己的方法
feer.say()
FEEnginner.test()//調用靜態方法

 

 

簡單的多態

同一個介面,在不同情況下做不一樣的事情

相同的介面,不同的表現

在js中,介面可以理解為,需要子類去實現的方法

//多態
//子類如果有父類的同名方法,則會執行子類自己的方法,不會去走父類的
class Human{
    say(){
        console.log("我是人")
    }
}

class Man extends Human{
    say(){
        super.say()//調用父類的同名方法
        console.log("我是小哥哥")
    }
}

class Woman extends Human{
    say(){
        super.say()//調用父類的同名方法
        console.log("我是小姐姐")
    }
}

new Man().say()
new Woman().say()

 

 

重載演示:三個案例

//重載演示1
class simpleCalc{
    add(...args){
        if(args.length===0) return this.zero()
        if(args.length===1) return this.one(args)
        return this.sum(args)
    }

    zero(){
        return 0
    }

    one(args){
        return args[0]
    }

    sum(args){
        //累加
        return reduce((a,b)=>a+b,0)
    }
}

 

//重載演示2
function post(url,header,params){
    //如果沒有第三個參數,則傳入的第二個參數賦值給params,header預設為null
    if(!params){
        params=header
        header=null //undefind也可以

    }
}
post("https://baidu.com",{
    a:1,
    b:2
})

 

//重載演示3
//有方法必須通過子類去實現,不然就會報錯

//映射表
const ModelMap={
    "紅眼僵屍":1,
    "南瓜精":2,
    "獨眼蝠":3,
    "綠眼僵屍":4,
}
//基類 怪物類
class Monster{
    constructor(name,level,model){
        this.name=name
        this.level=level
        this.model=model
    }

    attack(){
        throw Error("必須由子類來實現`attack`攻擊方法")
    }
}

//子類 紅眼僵屍類
class RedEyeZombie extends Monster{
    constructor(name,level,model){
        super("紅眼僵屍",10,ModelMap["紅眼僵屍"])
    }
}

//子類 綠眼僵屍類
class GreenEyeZombie extends Monster{
    constructor(name,level,model){
        super("綠眼僵屍",20,ModelMap["綠眼僵屍"])
    }

    attack(){
        console.log("綠眼僵屍發動了攻擊")
    }
}

const gez=new GreenEyeZombie()
gez.attack()

const rez=new RedEyeZombie()
rez.attack()

 

 

ES5中的繼承

//ES5中繼承的實現
//不是真正意義上的繼承,而是在原型鏈上操作

//1、利用構造函數(不能繼承原型上的方法)
//父類
function P(){
    this.name="parent";
    this.gender=2;
    this.say=function(){
        console.log("好的好的,我一定到,咕咕咕");
    }
}
P.prototype.test=function(){
    console.log("我是原型上的方法");
}
//子類
function C(){
    P.call(this);//實現繼承的一種方式
    this.name="child";
    this.age=18;
}
var c=new C();
c.say();
//c.test();//不能繼承原型上的方法


//解決方法,把子類的原型變成父類的實例
function P2(){
    this.name="parent";
    this.gender=2;
    this.say=function(){
        console.log("好的好的,我一定到,咕咕咕");
    }
}
P2.prototype.test=function(){
    console.log("我是原型上的方法");
}
//子類
function C2(){
    P2.call(this);//實現繼承的一種方式
    this.name="child";
    this.age=18;
}
C2.prototype=new P2();//把C2的原型變成P2的實例(因為P2的實例能夠訪問到P2原型上的方法)

var c2=new C2();
c2.say();
c2.test();//成功繼承原型上的方法

 


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

-Advertisement-
Play Games
更多相關文章
  • 2020 年 3 月,Kylin 社區決定將 Kylin 的標語從「Extreme OLAP Engine for Big Data」更改為 「Analytical Data Warehouse for Big Data」,以更加準確地描述 Kylin 的能力和定位,也更容易地讓用戶通過搜索引擎檢索... ...
  • 如何併發的訪問資料庫呢?答案就是加鎖。 接下來說一下,資料庫的鎖機制,資料庫中都有哪些鎖? 首先呢,鎖是一種併發控制技術,鎖是用來在多個用戶同時訪問同一個數據的時候保護數據的。 有2種基本的鎖類型: 共用(S)鎖:多個事務可封鎖一個共用頁;任何事務都不能修改該頁;通常是該頁被讀取完畢,S鎖立即被釋放 ...
  • 作為 Android 11 開發者預覽版的一部分,Google 已經發佈了 "Android 11 系統鏡像" ,它們能夠執行 ARM 二進位文件,性能得到了顯著提升。 以前,依賴於 ARM 庫而無法構建 x86 變體應用程式的開發人員要麼必須使用具有完全 ARM 模擬的系統映像,這比在基於 x86 ...
  • 在Flutter預設創建的項目中可以使用系統Material圖標,在 文件中使用圖標設置如下: 系統圖標如下: 如果這裡面沒有我們想要的圖標如何處理呢?這時可以使用第三方圖標庫,下麵以 "阿裡巴巴的圖標" 庫為例。 查找圖標並加入購物車 找到自己想要的圖標後,將滑鼠放置到圖標上,加入購物車,如下圖: ...
  • 本文記錄如何讓網頁中的JS代碼和APP進行交互,簡單的說就是如何在網頁中執行APP的代碼。下麵以在網頁中執行代碼打開撥號鍵盤並輸入電話號碼為例介紹如何實現。 一、設置WebView允許它執行js代碼。 二、通過調用WebView的addJavascriptInterface添加一個對象給js使用,添 ...
  • 表格和邊框屬性, 表格表頭單元格,表格標題<caption>,表格高度和寬度,表格背景,表格空間,合併單元格,表格頭部、主體、頁腳,定義表格,定義表格的行,定義表格列的組定義用於表格列的屬性,定義表格的頁眉,定義表格的主體定義表格的頁腳<table><tbody><tr><th>\定義表格的表頭,<... ...
  • 一、繼續完善之前的頁面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>D188_3DPlayerXia</title> <style> *{ margin:0px; padding:0px; } body{ ...
  • 最近接手了公司兩個項目,一個PC端後臺管理系統,一個app端項目,當然使用的依然是熟悉“Vue全家桶”那套!但是,當我打開項目時,裡面的代碼是這樣的(路由模塊): 就是所有路由配置都放到一個index.js中,這多少還是讓我有點驚呆的,顯然,項目會越做越大,模塊會越加越多,那這種不分模塊的架構方式明 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...