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によるグレースケールリリースの実装

推薦する

MySQL インデックスのクイックガイド

MySQL インデックスの確立は、MySQL の効率的な操作にとって非常に重要です。インデックスによ...

CSS導入方法4つのまとめ(共有)

1. インライン参照:ラベルに直接使用されるが、メンテナンスコストが高い スタイル='フォ...

Vue3の一般的なAPIの使用方法の紹介

目次ライフサイクルの変化反応的な参照vue2.x では ref を使用して要素タグを取得します。vu...

32 典型的な列/グリッドベースのウェブサイト

列ベースの Web デザインのインスピレーションをお探しの場合は、32 個のクラシックな列/グリッド...

MySQL で複数のフィールドを連結する詳細な例

MySQL クエリ結果の行フィールドの結合は、次の 2 つの関数を使用して実装できます。 1. co...

JavaScript オブジェクトの組み込みオブジェクト、値型、参照型の説明

目次物体オブジェクト定義オブジェクトのメンバーを反復処理するJS組み込みオブジェクト数学オブジェクト...

MySQL PHP 構文の簡単な分析

まずcharAt関数の基本的な構文を見てみましょう文字 = str.charAt(インデックス) c...

純粋な CSS で DIV サスペンションを実装するサンプル コード (固定位置)

DIV フローティング効果 (固定位置) は CSS のみで実装されており、IE8、360、Fir...

mysql 変数の使用例の分析 [システム変数、ユーザー変数]

この記事では、例を使用して MySQL 変数の使用方法を説明します。ご参考までに、詳細は以下の通りで...

CSS スキル コレクション - 古典の中の古典

リンク上の点線のボックスを削除しますコードをコピーコードは次のとおりです。 a:アクティブ、a:フォ...

CSS を使用して固定左列と適応右列の 2 列レイアウトを実現する 4 つの方法

1. フロート+オーバーフロー:非表示このメソッドは主にオーバーフローを通じて BFC をトリガーし...

背景画像の配置におけるbackground-position属性の自己理解

最近、プロジェクトではラベルやボタンなどの断片的な画像をたくさん使用する必要があります。また、CSS...

Tomcatはスレッドプールを使用してリモート同時リクエストを処理します。

Tomcatが同時リクエストを処理する方法を理解することで、スレッドプール、ロック、キュー、および...

Dockerは1行のコマンドでFTPサービス構築の実装を完了します

1行のコマンド docker run -d \ -v /share:/home/vsftpd \ -...

Docker Consul コンテナ サービスの更新と見つかった問題の概要

目次1. コンテナサービスの更新とDockerコンサルの検出1. サービス登録と検出とは何ですか? ...