JS における ES6 継承と ES5 継承の違い

JS における ES6 継承と ES5 継承の違い

継承

ES5 プロトタイプ継承

継承はプロトタイプ チェーン (コンストラクター + [[prototype]]) を通じて実現されます。 (注: 今後は__proto__を[[prototype]]の形式で記述します)
サブクラスのプロトタイプは、親クラス オブジェクトのインスタンスです。したがって、サブクラスのプロトタイプ オブジェクトには親クラスのプロトタイプ オブジェクトへのポインターが含まれ、親クラスのインスタンス属性はサブクラス プロトタイプの属性になります。

// 親クラス: function SuperType; サブクラス: function SubType;
SubType.prototype = new SuperType(); // SubType は SuperType を継承します

// プロトタイプチェーンに関する前のセクションで述べた知識ポイントによれば、インスタンス化されたオブジェクトの__proto__はコンストラクタのプロトタイプに等しい
SubType.prototype.__proto__ === SuperType.prototype // true

上記の継承関係は以下のとおりです。

内部実装メカニズムの観点から見ると、ES5 の継承は実際には最初に this 上にサブクラスのインスタンス オブジェクトを作成し、次にこれに親クラスのメソッドを追加することです。同様の使用法: Father.apply(this)

ES6 クラス継承

継承はクラスの extends + super を通じて実現されます。
サブクラスには独自の this オブジェクトがないため、コンストラクターの super を通じて親クラスの this オブジェクトを継承し、この this オブジェクトにメソッドとプロパティを追加する必要があります。
コンストラクター内の super キーワードは親クラスのコンストラクターを表し、親クラスの新しい this オブジェクトを作成するために使用されます。
内部実装の仕組みから見ると、ES6 の継承の仕組みは完全に異なります。本質的には、まず親クラス this のインスタンス オブジェクトを作成します。そのためには、事前に super メソッドを呼び出し、次にサブクラスのコンストラクターを使用して this ポインターを変更する必要があります。

スーパー使用法

super は関数としてもオブジェクトとしても使用できます。
関数として使用する場合、サブクラスのコンストラクターでのみ使用できます。これは親クラスのコンストラクターを表しますが、super の this はサブクラスのインスタンスを参照するため、サブクラスでは super() は Father.prototype.constructor.call(this) を意味します。
オブジェクトとして使用される場合、superは親クラスのプロトタイプオブジェクト、つまりFather.prototypeを表します。

両者の違い

A: まったく同じではありません。いくつかの主な違いがあります。

  1. 文章が違います。クラスの継承は、extends キーワード、super 関数、super メソッドを通じて実現されます。 (継承を実装するために super を使用する方法については詳しく説明しません)
  2. クラス内で定義されたメソッドは列挙できませんが、ES5 は異なります。
  3. クラスには変数の昇格がありません。これはES5とはまったく異なります。
  4. クラスはインスタンスのプロトタイプと同等であり、クラスで定義されたすべてのメソッドはインスタンスに継承されます。メソッドの前に static キーワードを追加すると、メソッドはインスタンスによって継承されず、クラスを通じて直接呼び出され、静的メソッドになります。
  5. 内部実装メカニズムが異なります。

ES5 プロトタイプ継承の内部実装

ES5 での継承は、基本的に、最初にサブクラス this のインスタンス オブジェクトを作成し、次に親クラスのメソッドをサブクラス (this) --- Father.apply(this) に追加します。

ES6 クラス継承の内部実装

ES6 の継承メカニズムは完全に異なります。本質的には、最初に親クラスのインスタンス オブジェクト this を作成し、親クラスのプロパティとメソッドを this に配置し (super 関数を通じて呼び出された場合)、次に子クラスのコンストラクターを使用して this を変更します。

実装メカニズムが異なるため、これら 2 種類の継承では、ネイティブ コンストラクターを継承するときにいくつかの違いがあります。

es5 の記述ではネイティブ コンストラクター (Array、Number など) を継承できません。
es5 の継承では、まずサブクラスのインスタンス オブジェクト this を作成し、次に親クラスのプロトタイプのプロパティとメソッドをサブクラスに書き換えます。親クラスの内部プロパティにアクセスできないため、es5 の継承メソッドはネイティブ コンストラクターを継承できません。
es6 では、コンストラクターの継承によってサブクラスを生成できます。 es6 は最初に親クラスのインスタンス オブジェクト this を作成し、次にサブクラスのコンストラクターでそれを変更するため、サブクラスは親クラスのすべてのプロパティとメソッドを継承できます。したがって、クラスはネイティブ コンストラクターのサブクラスを継承してカスタマイズできます。 Extends はクラスの継承だけでなく、ネイティブ コンストラクターの継承にも使用できるため、ネイティブ データ構造に基づいてカスタム データ構造を構築できます。

拡張機能

内部実装メカニズムの説明については、「Ruan Yifeng の es6 ドキュメント - クラス継承」の関連セクションを参照してください。

JavaにおけるES6継承とES5継承の違いについての記事はこれで終わりです。ES6継承とES5継承の違いについてさらに詳しく知りたい方は、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript ES5における継承の詳細な説明
  • JS上級編ES6の6つの継承方法
  • JS オブジェクト指向プログラミング - ES6 におけるクラス継承の詳細な説明
  • ES6 JavaScript におけるクラス継承の詳細な使用例
  • Javascript ES5とES6の7つの継承タイプの詳細な説明

<<:  MySql データベースのサブクエリと高度なアプリケーションの簡単な分析

>>:  NginxとLuaによるグレースケールリリースの実装

推薦する

Vueはカスタム命令を使用してページの下部に透かしを追加します

プロジェクトシナリオプロジェクトの背景全体にカスタム透かしを追加します。透かしのテキスト、フォントの...

Nginx アップロードファイルのサイズを変更する簡単な方法

オリジナルリンク: https://vien.tech/article/138序文私は、マークダウン...

JS WebSocketを使用して簡単なチャットを実装する方法

目次ショートポーリングロングポーリングウェブソケットコミュニケーションの原則シンプルな1対1チャット...

CSS の Display、Visibility、Opacity、rgba、z-index: -1 の違い

ウェブページ上のいくつかの要素の非表示、透明、その他のプロパティを制御する必要があることがよくありま...

プライベートレジストリ内の画像を照会または取得する方法

Dockerはプライベートレジストリ内のイメージを照会または取得するために、 docker 検索 1...

MySQL サーバー 5.5 の接続失敗の解決策

mysqlに接続できない問題の解決方法を参考までに紹介します。具体的な内容は以下のとおりです。昨日は...

Linux チェックアップ、Linux の状態 (ネットワーク IO、ディスク、CPU、メモリ) を把握

目次1. コアコマンド2. 共通コマンド3. コアコマンドの詳細な説明3.1、ps補助3.2 トップ...

MySQL 5.7.18 のインストール中に MySQL サービスの起動に失敗する問題の解決策

MySQL は非常に強力なリレーショナル データベースです。しかし、初心者の中には、インストールや設...

MySQL マスターとスレーブの不整合とその解決策の詳細な説明

1. MySQL マスタースレーブ非同期1.1 ネットワーク遅延MySQLのマスタースレーブレプリケ...

ウィンドウ環境設定Mysql 5.7.21 windowx64.zip無料インストール版チュートリアル詳細説明

1. 公式サイトのmysqlダウンロードページからmysql-5.7.21-windowx64.zi...

Apache ab を使用して HTTP パフォーマンス テストを実行する

MacにはApache環境が付属していますターミナルを開き、sudo apachectl -v と入...

CSS グリッドレイアウトの完全ガイド

Grid は 2 次元のグリッド レイアウト システムです。これを使用すると、本質的にはハック メソ...

Vueページジャンプの実装方法

1. this.$router.push() 1. ビュー <テンプレート> <d...

マルチポートおよびマルチドメイン名アクセスのNginx構成の実装

サーバーに複数のサイトを展開するには、異なるサイトにアクセスするために複数のポートを開く必要がありま...

React は入力値を取得し、2 つのメソッドの例を送信します

方法1: DOMが提供するイベントオブジェクトのターゲットイベント属性を使用して値を取得し、送信する...