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 ルートパスワードを忘れた場合の解決策

推薦する

MySQL のタイムスタンプと日付時刻のタイムゾーンの問題によって生じる DTS の落とし穴の詳細な説明

目次MySQL で現在の時刻を表現するにはどうすればよいでしょうか?結論は確認するピットMySQL ...

Linuxシステムにおけるプロセス管理の詳細な説明

目次1. プロセスとスレッドの概念2. プロセス管理とは何ですか? 3. プロセス管理の役割4. L...

よく使われるJavaScript配列メソッド

目次1. フィルター() 2. 各() 3. いくつか() 4. すべて() 5. 減らす() 6....

DockerコンテナでArthasを使用するための詳細な手順

Arthas はあなたのために何ができるでしょうか? Arthas 、開発者に深く愛されている Al...

MYSQL における char と varchar の違い

CHAR 型と VARCHAR 型は似ていますが、主に格納場所、末尾のスペース、取得方法が異なります...

Linux がますます人気になっている 10 の理由

Linux はますます多くのユーザーに愛されてきました。なぜ Linux はこれほど急速に発展し、い...

JS を使用してクリップボード内の Excel コンテンツを解析する方法

目次序文1. イベントとクリップボードを貼り付ける2. クリップボード内のコンテンツ形式3. HTM...

Gobangゲームを実現するためのjsキャンバス

この記事では、Gobangゲームを実装するためのキャンバスの具体的なコードを参考までに共有します。具...

Vueバインディングクラスとバインディングインラインスタイルの実装方法

目次バインディングクラスインラインスタイルのバインディングバインディングクラス方法1:オブジェクト構...

mysql charset=utf8 本当に意味が分かりますか

1. まずテーブル作成ステートメントを見てみましょう テーブル学生を作成( sid int 主キー ...

Docker コンテナの uid と gid の詳細な理解

デフォルトでは、コンテナ内のプロセスは root ユーザー権限で実行され、この root ユーザーは...

CentOS 6.5 i386 インストール MySQL 5.7.18 詳細チュートリアル

ほとんどの人はMySQLをコンパイルしてシステムディレクトリに置きますが、私のやり方はコンパイルした...

docker compose を使用して consul クラスタ環境を構築する例

領事の基本概念サーバーモードとクライアントモードサーバー モードとクライアント モードは、consu...