ES5/ES6 的繼承除了寫法以外還有什么區別?

一、主要區別

  1. ES5 的繼承實質上是先創建子類的實例對象, 然后再將父類的方法添加
    到 this 上(Parent.apply(this)) .

  2. ES6 的繼承機制完全不同, 實質上是先創建父類的實例對象 this(所以必
    須先調用父類的 super()方法) , 然后再用子類的構造函數修改 this。

  3. ES5 的繼承時通過原型或構造函數機制來實現。

  4. ES6 通過 class 關鍵字定義類, 里面有構造方法, 類之間通過 extends 關
    鍵字實現繼承。

  5. 子類必須在 constructor 方法中調用 super 方法, 否則新建實例報錯。 因
    為子類沒有自己的 this 對象, 而是繼承了父類的 this 對象, 然后對其進行加工。
    如果不調用 super 方法, 子類得不到 this 對象。

  6. 注意 super 關鍵字指代父類的實例, 即父類的 this 對象。

  7. 注意: 在子類構造函數中, 調用 super 后, 才可使用 this 關鍵字, 否則
    報錯。

function 聲明會提升, 但不會初始化賦值。 Foo 進入暫時性死區, 類似于 let、
const 聲明變量。

const bar = new Bar();  
// it's ok  
function Bar() {  this.bar = 42;  
}
const foo = new Foo();  
// ReferenceError: Foo is not defined
class Foo {  constructor() {  this.foo = 42;  }  
}  

二、class 聲明內部會啟用嚴格模式。

// 引用一個未聲明的變量 function Bar() {  
baz = 42;  
// it's ok}const bar = new Bar();  
class Foo {  constructor() {  fol = 42;  // ReferenceError: fol is not defined  }  
}const foo = new Foo();  

三、class 的所有方法(包括靜態方法和實例方法) 都是不可枚舉的。

// 引用一個未聲明的變量 
function Bar() {  this.bar = 42;
}
Bar.answer = function() { return 42;  
};  
Bar.prototype.print = function() {  console.log(this.bar);  
};  
const barKeys = Object.keys(Bar);  
// ['answer']
const barProtoKeys = Object.keys(Bar.prototype);  
// ['print']class Foo {  constructor() {  this.foo = 42;  } static answer() {  return 42;  } print() {  console.log(this.foo);  }
}
const fooKeys = Object.keys(Foo);  
// []
const fooProtoKeys = Object.keys(Foo.prototype);  
// []  

四、class 的所有方法( 包括靜態方法和實例方法) 都沒有原型對象 prototype, 所以也沒有 constructor, 不能使用 new 來調用。

function Bar() {  this.bar = 42;  
}
Bar.prototype.print = function() {  console.log(this.bar);  
};  
const bar = new Bar();  
const barPrint = new bar.print();  // it's ok
class Foo {  constructor() {  this.foo = 42;  } print() {  console.log(this.foo);  }
}
const foo = new Foo();  
const fooPrint = new foo.print();  
// TypeError: foo.print is not a constructor  

必須使用 new 調用 class。

function Bar() {  this.bar = 42;  
}
// it's ok
const bar = Bar();  class Foo {  constructor() {  this.foo = 42;  }
}
const foo = Foo();  
// TypeError: Class constructor Foo cannot be invoked without 'new'  

五、class 內部無法重寫類名。

function Bar() {  Bar = 'Baz';  // it's ok this.bar = 42;  
}
const bar = new Bar();  
// Bar: 'Baz'  
// bar: Bar {bar: 42} class Foo {  constructor() {  this.foo = 42;  Foo = 'Fol';  // TypeError: Assignment to constant variable  }
}
const foo = new Foo();  
Foo = 'Fol';  
// it's ok

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

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

相關文章

C#根據反射生成sql語句(Update語句)

今天有人問我Update語句怎么搞,想了一下大致思路就是用特性去標識一下,主鍵,然后再去用反射的方式拼sql語句。 在C#中,我們可以使用特性(Attributes)來標識一個類的屬性作為該類的主鍵(Primary…

旅游卡系統開發搭建

旅游卡系統的開發搭建是一個涉及多個步驟和關鍵因素的復雜過程。以下是關于旅游卡系統開發搭建的詳細步驟和要點: 一、需求分析 目標用戶調研:深入調研目標用戶,了解他們的需求和痛點,從而確定系統的功能和特點。功能確定&#…

數據分析必備:一步步教你如何用Pandas做數據分析(20)

1、Pandas 分類數據 Pandas 分類數據的操作實例 數據通常實時包含重復的文本列。性別,國家/地區和代碼等功能始終是重復的。這些是分類數據的示例。 分類變量只能采用有限的且通常是固定數量的可能值。除固定長度外,分類數據可能還具有順序,…

elasticsearch安裝與使用(1)-使用docker安裝Elasticsearch

ES的優點: 1、分布式準實時2、提供REST風格的API接口,是用戶可解借助任何語言使用https對ES執行請求來完成搜索任務;3、提供聚合功能 1、Elasticsearch安裝 docker network create elastic docker pull docker.elastic.co/elasticsearch/e…

MySQL入門學習-聚合和分組.計數(COUNT()函數)

在 MySQL 中,聚合和分組是用于對數據進行匯總和分析的強大功能。聚合函數可以計算數據的總和、平均值、最小值、最大值等統計信息,而分組則可以將數據按照特定的字段進行分組,然后對每個分組進行聚合計算。計數(COUNT() 函數&…

【MYSQL系列】mysql中text,longtext,mediumtext區別

【MYSQL系列】mysql中text,longtext,mediumtext區別 在MySQL數據庫中,TEXT、LONGTEXT和MEDIUMTEXT都是用于存儲大量文本數據的字段類型。它們之間的主要區別在于可存儲的數據大小和性能方面的差異。本文將探討這些字段類型的特點、使用場景和一些最佳實踐。 TEXT類…

貪心(不相交的開區間、區間選點、帶前導的拼接最小數問題)

目錄 1.簡單貪心 2.區間貪心 不相交的開區間 1.如何刪除? 2.如何比較大小 區間選點問題 3.拼接最小數 1.簡單貪心 比如:給你一堆數,你來構成最大的幾位數 2.區間貪心 不相交的開區間 思路: 首先,如果有兩個…

代碼隨想錄算法訓練營第三十二天|LeetCode122 買賣股票的最佳時機Ⅱ、LeetCode55 跳躍游戲、LeetCode45 跳躍游戲Ⅱ

題1: 指路:122. 買賣股票的最佳時機 II - 力扣(LeetCode) 思路與代碼: 基本思路:一天買入一天賣出,得到每部分正利潤作為局部最優解,例如prices[7, 1, 5, 3, 6, 4]中,…

山東大學軟件學院項目實訓-創新實訓-基于大模型的旅游平臺(三十)- 微服務(10)

目錄 12.5 RestClient操作索引庫 12.5.1創建庫 12.5.2 刪除索引庫 12.5.3 判斷是否存在 12.6 RestClient操作文檔 12.6.1 新增文檔 12.6.2 查詢文檔 12.6.3 修改文檔 12.6.4 刪除文檔 12.6.5 批量導入文檔 12.5 RestClient操作索引庫 酒店mapping映射 ?PUT /hotel{&…

shell簡介

一、Shell 概念定義 Shell 是用 C 語言編寫的程序,是用戶使用 Linux 的橋梁,既是命令語言又是程序設計語言。 shell 腳本為 Shell 編寫的腳本程序,常說的 shell 通常指 shell 腳本。 包含一系列命令的文本文件,這些命令按照特定…

調試環境搭建(Redis 6.X 版本)

今兒,我們來搭建一個 Redis 調試環境,目標是: 啟動 Redis Server ,成功斷點調試 Server 的啟動過程。使用 redis-cli 啟動一個 Client 連接上 Server,并使用 get key 指令,發起一次 key 的讀取。 視頻可見…

【python解決】查詢報%d format: a number is required, not str問題

【Python解決】查詢報%d format: a number is required, not str問題 在Python中,字符串格式化是一種常見的操作,用于創建包含變量的字符串。如果你在使用%操作符進行格式化時遇到了%d format: a number is required, not str的錯誤,這意味著…

C# 集合(二) —— List/Queue類

總目錄 C# 語法總目錄 集合二 List/Queue 1. List2. Queue 1. List List有ArrayList和LinkedList ArrayList 類似數組,查找快,插入刪除慢(相對)LinkedList 類似雙向鏈表,查找慢(相對),插入刪除快 //ArrayList //ArrayList Arr…

ts和js有什么不同

TypeScript(簡稱TS)和JavaScript(簡稱JS)之間的主要區別可以歸納為以下幾點: 類型系統: JS:是一種弱類型、動態類型的語言,變量的類型在運行時確定,沒有靜態類型選項。T…

基于SSM的旅游民宿預定系統【源碼】【運行教程】

基于SSM的旅游民宿預定系統 一、項目介紹1. 游客功能2. 管理員功能3. 高級功能 二、項目技術棧三、項目運行四、項目演示總結 大家好,這里是程序猿代碼之路!隨著旅游業的快速發展,民宿作為一種獨特的住宿方式越來越受到游客的喜愛。為了提升用…

百華鞋業祝莘莘學子旗開得勝,一舉奪魁

在知識的海洋中, 有一群人以筆為劍, 在漫長的歲月里不斷磨礪, 只為迎接那場人生的重要戰役——高考。 高考, 是學子們十幾年寒窗苦讀的見證, 是他們用奮斗書寫青春考卷的舞臺。 在這個舞臺上, 他們將…

當前主流的App開發技術綜述

一、引言 隨著移動互聯網的蓬勃發展,App(應用程序)已經成為人們日常生活中不可或缺的一部分。無論是社交、購物、娛樂還是工作學習,App都以其便捷、高效和個性化的特點深受用戶喜愛。而在這一過程中,App開發技術也在不…

周末總結(2024/06/08)

工作 人際關系核心實踐: 要學會隨時回應別人的善意。執行時間控制在5分鐘以內 堅持每天早會打招呼 遇到接不住的話題時拉低自己,抬高別人(無陰陽氣息) 工作上的要點 現狀(接受破爛現狀,改變狀態) - 和老師溝通過&…

ChatGPT-4o體驗demo

OpenAI 最近推出了其最新的人工智能語言模型——GPT-4O。該模型是在原有 GPT-4 的基礎上進行優化而成,旨在提升生成質量和響應速度。GPT-4O 采用了更加高效的架構設計,使其在處理復雜文本時表現出更快的速度和更高的準確性。GPT-4O 在訓練過程中融入了最…

一些關于機器學習的思路和猜測

一、機器學習能做什么 1、網上說機器學習就是根據已有的圖片、文字、視頻資料,建立一個數據庫,用一個處理算法,把已有的資料進行提取關鍵特征和一些聯系,存入數據庫中。 2、當學習到一定程度,就能跟人一樣到實際場景…