JavaScriptで継承を実装するいくつかの方法

JavaScriptで継承を実装するいくつかの方法

ES6 以外のコードで継承を実装する主流の方法は、次のように分けられます。
構造継承、プロトタイプチェーン継承、構造継承 + プロトタイプチェーン継承の複合継承、および複合継承から派生した継承メソッド。

構造継承(callで実装)

成し遂げる

関数Super(age){
 this.age = 年齢;
 this.say = 関数(){
 コンソールログ(this.age)
 }
}
関数 Child(名前,年齢){
 Super.call(これ、年齢)
 this.name = 名前;
}
var child = 新しいChild("min",23)
console.log(Super の子インスタンス); // false
console.log(child instanceof Child); // true

アドバンテージ

(1)多重継承が可能(複数の親クラスオブジェクトを呼び出す)
(2)コンストラクタ内で親にパラメータを渡すことができる

欠点

(1)継承できるのは親クラスのインスタンスのプロパティとメソッドのみであり、プロトタイプのプロパティとメソッドは継承できない。
(2)インスタンスは親クラスのインスタンスではなく、子クラスのインスタンスである

プロトタイプチェーン継承(プロトタイプチェーンの助けを借りて実装)

成し遂げる

関数Super(){
 this.getName = 関数(){
 console.log(この名前)
 }
}
関数Child(名前){
	this.name = 名前;
}
Child.prototype = new Super(); // ここで構築パラメータを渡すことができます Child.prototype.constructor = Child;
var child = new Child("min");
console.log(子インスタンスSuper); // true
console.log(child instanceof Child); // true
console.log(child.constructor); // 子

アドバンテージ
(1)親クラスのプロトタイププロパティとメソッドは子クラスからアクセス可能である
(2)インスタンスはサブクラスのインスタンスであり、親クラスのインスタンスでもある

欠点
(1)多重継承ができない (2)サブクラスのインスタンスを作成する際に、親クラスのコンストラクタにパラメータを渡すことができない

複合継承(構築継承 + プロトタイプチェーン継承)

成し遂げる

関数Super(age){
 this.age = 年齢;
 this.getAge = 関数(){
 コンソールにログ出力します。
 }
}
関数 Child(名前,年齢){
 Super.call(これ、年齢)
 this.name = 名前;
}
Child.prototype = 新しいSuper(1); 
Child.prototype.constructor = Child;
var child = new Child("min",23);
console.log(子インスタンスSuper); // true
console.log(child instanceof Child); // true
console.log(child.constructor); // 子

アドバンテージ
(1)構築+プロトタイプチェーン継承の利点を組み合わせる

欠点
(1) Child.prototype = new Super(); がもう一度呼び出され、その結果、上記の例の age プロパティなど、プロトタイプ オブジェクトに不要なプロパティがいくつか作成されます。

寄生的な構成継承

成し遂げる

関数Super(age){
 this.age = 年齢;
 this.getAge = 関数(){
 コンソールログ(this.age)
 }
}
関数 Child(名前,年齢){
 Super.call(これ、年齢)
 this.name = 名前;
}
(関数(){
 関数コピー(){}
 Copy.prototype = Super.prototype;
 Child.prototype = 新しいコピー();
})()
Child.prototype.constructor = Child;
var child = new Child("min",23);

注: Child.prototype = Super.prototype を直接使用しないのはなぜですか?
答え: Child.prototype.constructor = Child; 上記のSuper.prototypeを書くとキーコードも変わります(参照型、同じアドレスを指す)

アドバンテージ
(1) これは継承を実装するための最も完璧なソリューションです。es6 extends キーワードも、コードが babel によって変換された後、このように継承を実装します。

追加: (Object.create) を使用

成し遂げる

関数Super(age){
 this.age = 年齢;
 this.getAge = 関数(){
 コンソールログ(this.age)
 }
}
関数 Child(名前,年齢){
 Super.call(これ、年齢)
 this.name = 名前;
}
Child.prototype = Object.create(Super.prototype,{
 コンストラクター:{ // コンストラクターは値を修復します: 子
 }
})
var child = new Child("min",23);
console.log(子インスタンスSuper); // true
console.log(child instanceof Child); // true
console.log(child.constructor); // 子

上記は、JavaScript で継承を実装するいくつかの方法の詳細です。JavaScript 実装継承の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • 1 つの記事で JavaScript の継承を理解する
  • js の一般的な継承方法 6 つの概要
  • JS上級編ES6の6つの継承方法
  • JS の 6 つの継承方法とその長所と短所
  • ネイティブ JavaScript 継承方法とその長所と短所の詳細な説明
  • jsの継承の6つの方法を詳しく解説
  • 6 つの JavaScript 継承方法とその長所と短所 (まとめ)
  • JS で継承を実装する一般的な方法の例
  • JavaScriptで複数の継承メソッドを共有する

<<:  Nginx 正規表現の詳細な説明

>>:  MACOS で MySQL ルートパスワードを忘れた場合の解決策

推薦する

WebStormはVue3統合APIのソリューションを正しく識別できません

1 問題の説明Vue3 の統合 API は、defineComponent やその他の関数が認識でき...

MySQL 5.7.15 のインストールと設定方法のグラフィック チュートリアル (Windows)

MySQL をインストールする必要があるため、インストール手順を以下のように記録します。 自分なり...

JSはプログレスバーのスムーズバージョンの詳細な計画を実装します

進捗バーがスムーズではないフロントエンドを学ぶ学生のほとんどは、オーディオプレーヤーやビデオプレーヤ...

MySQLトリガーの使用

目次1. トリガーの紹介1. トリガーとは何ですか? 2. トリガーの特徴2. トリガーを作成する1...

JavaScript Sandboxについての簡単な説明

序文:サンドボックスといえば、私たちの頭には反射的に上の写真が思い浮かび、すぐに興味がわいてくるかも...

NestJsはMongooseを使用してMongoDBを操作する

最近、NestJs フレームワークを学び始めました。学習コストは他のフレームワークよりもはるかに高く...

MySQL 5.7.21 winx64 グリーンバージョンのインストールと設定方法のグラフィックチュートリアル

この記事ではMySQL 5.7.21のインストールと設定方法を記録しています。具体的な内容は以下のと...

Vueのライブ放送機能の詳しい説明

最近、会社でたまたま生放送をしていたのですが、今日は私が遭遇した落とし穴を記録します。会社のサーバー...

Vue で debouce の手ぶれ補正機能を使用する方法

目次1. 手ぶれ補正機能2. Vueでdebouceの手ぶれ補正機能を使用する1. 手ぶれ補正機能2...

単語のグループ化シーケンスと複数フィールドのグループ化のための MySQL グループ方法

ここで商品テーブルを作成しました。その中のデータを見てみましょう。 mysql> 商品から *...

JavaScript における var、let、const の違いの詳細な説明

目次グローバル変数として可変ホイスト一時的なデッドゾーンブロックスコープ重複したステートメント宣言さ...

MySQL の全体的なアーキテクチャの紹介

MySQL の全体的なアーキテクチャは、サーバー層とストレージ エンジン層に分かれています。サーバー...

MySQL 8.0.16 Win10 zip バージョンのインストールと設定のグラフィック チュートリアル

この記事では、MySQL 8.0.16 Win10 zip版のインストールと設定のグラフィックチュー...

Vueはシンプルなショッピングカートの例を実装します

この記事では、Vueの具体的なコードを共有して、簡単なショッピングカートを実装します。具体的な内容は...

MySQL 5.7.23 解凍バージョンのインストールチュートリアル(画像とテキスト付き)

毎回インストールチュートリアルを探すのは面倒なので、後で確認できるように手順をバックアップします。解...