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

推薦する

Vue3 テーブルコンポーネントの使用

目次1. Antデザインビュー1. 公式ウェブサイトアドレス2. 使い方3.電子書籍テーブルを表示す...

Linux ユーザー グループと権限の概要

ユーザーグループLinux では、すべてのユーザーはグループに属する必要があり、Linux には次の...

VUE uni-app でよく使用される API についての簡単な説明

目次1. ルーティングとページジャンプ2. インターフェース要約する1. ルーティングとページジャン...

MySQL は対応するクライアント プロセスにどのように接続しますか?

質問特定の MySQL 接続について、それがどのクライアント プロセスからのものであるかをどのように...

Linux でショートカットアイコンを設定する方法

序文Linux でショートカットを作成すると、アプリケーションをより速く開くことができます。ここで、...

Cronジョブを使用してCpanelでPHPを定期的に実行する方法

cpanel 管理バックエンドを開き、「詳細」オプションの下に「Clock Guardian Job...

CSS3のbox-shadowプロパティの使い方の詳細な例

CSS には多くの属性があります。特に複数の値を設定する必要がある属性は、長期間使用しないと忘れられ...

エラー 1045 (28000): ユーザー ''root''@''localhost'' のアクセスが拒否されました (パスワード使用: YES) 実用的な解決策

昨日はデータベースへの接続に問題はありませんでしたが、今日はデータベースへの接続時にこのエラーが報告...

n 個のコンテナ要素による無限スクロールの実装コード

シナリオ最大 10000 要素のリストを正しくレンダリングする方法。無限ドロップダウン読み込みテクノ...

この記事ではCSSボーダーの使い方を説明します

境界線のスタイルborder-style プロパティは、表示する境界線の種類を指定します。 bord...

HTML 5 スタイルシートのリセット

この CSS リセットは、Eric Meyers の CSS リセットに基づいて変更されており、特に...

MySQLとSpringの自動コミットの詳細な説明

1 MySQLの自動コミット設定MySQL はデフォルトで自動的にコミットします。つまり、各 DML...

MySQL パフォーマンスの最適化: インデックスを効率的かつ正しく使用する方法

実践こそが真実をテストする唯一の方法です。この記事では、インデックスの全体的な使用法についてのみ説明...

DockerとFastDFSのインストールコマンドと使い方の詳しい説明

Dockerの機能1) すぐに始められるユーザーがプログラムを「Docker 化」するには、わずか数...

Idea は、Web プロジェクトを開始するように Tomcat を設定します。グラフィック チュートリアル

tomcatの設定1. 実行構成をクリック 2. tomcat localを選択 3. tomcat...