jsの継承の6つの方法を詳しく解説

jsの継承の6つの方法を詳しく解説

プロトタイプチェーン継承

プロトタイプ継承は、ECMAScript における主な継承方法です。基本的な考え方は、プロトタイプを通じて複数の参照型のプロパティとメソッドを継承することです。プロトタイプ チェーンとは何ですか? 各コンストラクターにはプロトタイプ オブジェクトがあります。コンストラクターを呼び出すことによって作成されたインスタンスには、プロトタイプ オブジェクトを指すポインター __proto__ があります。このプロトタイプは別の型のインスタンスである可能性があり、内部に別のプロトタイプを指すポインターもある可能性があり、プロトタイプ チェーンが形成されます。

コード:
関数SuperType() {
	this.property は true です。
}
SuperType.prototype.getSuperValue = 関数() {
	this.property を返します。
};
関数サブタイプ() {
	this.subproperty = false;
}
// スーパータイプを継承
SubType.prototype = 新しい SuperType();
SubType.prototype.getSubValue = function () { //オブジェクトリテラルを通じて新しいメソッドを追加できないことに注意してください。そうしないと、前の行が無効になります。 return this.subproperty; 
};
インスタンスを新しい SubType() にします。
console.log(instance.getSuperValue()); // 真

欠点

1. 親クラスインスタンスの属性が参照型の場合、親クラスのインスタンス属性はサブクラスのプロトタイプ属性になります。サブクラスによって作成されたすべてのインスタンスはこれらのメソッドを共有します。1 つのインスタンスの属性が変更されると、他のインスタンスの属性も変更されます。

2. サブタイプはインスタンス化時に親タイプのコンストラクタにパラメータを渡すことができない

コンストラクタの継承

参照値を含むプロトタイプによって発生する継承問題を解決するために、「オブジェクト マスカレード」または「古典的継承」としても知られる「コンストラクタの窃盗」と呼ばれる手法が普及しました。その考え方は、サブクラスでコンストラクタを使用するというものです。

親クラスのコンストラクターが番号で呼び出されます。 call() メソッドと apply() メソッドを使用して、新しく作成されたオブジェクトをコンテキストとして関数を実行できます。

関数SuperType(名前) {
 this.colors = ["赤","青","緑"];
 this.name = 名前;
 }
関数サブタイプ(名前) {
 SuperType.call(this,name);
}
インスタンス1 = 新しいスーパータイプ('Xiaoming')
let instance2 = new SuperType('小白')
インスタンス1.colors.push('黄色')
console.log(instance1) //{name:"Xiao Ming",colors:["red","blue","green","yellow"]...}
console.log(instance2) //{name:"Xiaobai",colors:["red","blue","green"]...}

//パラメータを渡して参照の問題を修正できます。複数のコンストラクタプロパティを継承できます(複数呼び出し)

欠点:

1. メソッドはコンストラクタ内でのみ呼び出すことができます。関数は再利用できません。つまり、サブクラスがインスタンスを生成するたびに、属性とメソッドが 1 回生成されます。
2. サブクラスは親クラスのプロトタイプのメソッドにアクセスできない

コンポジション継承

プロトタイプ チェーンとコンストラクターを組み合わせて、両方の利点を組み合わせます。基本的な考え方は、プロトタイプ チェーンを使用してプロトタイプのプロパティとメソッドを継承し、コンストラクターを通じてインスタンス プロパティを継承することです。これにより、プロトタイプ上でメソッドを定義して再利用できるようになると同時に、各インスタンスに独自のプロパティを持たせることもできます。

関数SuperType(名前){
	this.name = 名前;
	this.colors = ["赤","青","緑"];
}
SuperType.prototype.sayName = 関数() {
	コンソールにログ出力します。
};
関数 SubType(名前, 年齢){
	// 継承されたプロパティ 2 番目の呼び出し SuperType.call(this, name);
	this.age = 年齢;
}
// 継承されたメソッドの最初の呼び出し SubType.prototype = new SuperType();
SubType.prototype.sayAge = function() {
	コンソールにログ出力します。
};
instance1 = new SubType("Nicholas", 29); とします。
instance1.colors.push("黒");
console.log(instance1.colors); //["赤、青、緑、黒"]
instance1.sayName(); // "ニコラス";
instance1.sayAge(); // 29
instance2 = new SubType("Greg", 27); とします。
console.log(instance2.colors); // ["赤、青、緑"]
instance2.sayName(); // "グレッグ";
instance2.sayAge(); // 27

//親クラスのプロトタイプのプロパティを継承し、パラメータを渡し、再利用することができます。 各新しいインスタンスによって導入されるコンストラクタプロパティはプライベートです

欠点

親クラスのコンストラクタを2回呼び出すと、より多くのメモリが消費されます。

プロトタイプ継承

カスタムタイプを定義しなくても、プロトタイプを通じてオブジェクト間で情報を共有できます。

関数オブジェクト(人) {
 関数 F() {}
 F.プロトタイプ = 人
 新しいF()を返す
}

人 = {
 名前:「シャオミン」
 色:['赤','青']
}

person1 = オブジェクト(人)とする
person1.colors.push('緑')
person2 = オブジェクト(人)とする
person1.colors.push('黄色')
console.log(person) //['赤','青','緑','黄']

適用可能な環境: オブジェクトがあり、それに基づいて新しいオブジェクトを作成したい場合。まずこのオブジェクトを object() に渡し、返されたオブジェクトを適切に変更する必要があります。最初のパラメータのみが渡された場合の Object.create() と同様に、渡されたオブジェクトの浅いコピーが本質的に作成されます。欠点は、新しいインスタンスのプロパティが後で追加され、再利用できないことです。

寄生遺伝

プロトタイプ継承に近い継承のタイプは寄生継承です。これは寄生コンストラクターやファクトリー パターンに似ています。継承を実装する関数を作成し、何らかの方法でオブジェクトを拡張してから、オブジェクトを返します。

関数オブジェクト(人) {
 関数 F() {}
 F.プロトタイプ = 人
 新しいF()を返す
}
関数createAnother(オリジナル){
	let clone = object(original); // 関数を呼び出して新しいオブジェクトを作成します clone.sayHi = function() { // 何らかの方法でこのオブジェクトを強化します console.log("hi");
};
	return clone; // このオブジェクトを返す}

寄生継承は、主にオブジェクトに関心があり、型やコンストラクターを気にしないシナリオにも適しています。
デメリット: 寄生継承を通じてオブジェクトに関数を追加すると、コンストラクタパターンと同様に、関数の再利用が難しくなります。

寄生的な構成継承

最も一般的に使用される継承方法が最適です。結合継承では親クラスのコンストラクターが 2 回呼び出されるため、効率の問題が生じます。実際、サブクラス プロトタイプの本質は、親クラス オブジェクトのすべてのインスタンス プロパティを含めることです。サブクラス コンストラクターは、実行時に独自のプロトタイプを書き換えるだけで済みます。基本的な考え方は、親クラスのコンストラクターを呼び出してサブクラスのプロトタイプに値を割り当てるのではなく、親クラスのプロトタイプのコピーを取得することです。最終的には、寄生継承を使用して親クラスのプロトタイプを継承し、返された新しいオブジェクトを子クラスのプロトタイプに割り当てます。

//コアコード function object(person) {
 関数 F(パラメータ) {}
 F.プロトタイプ = 人
 新しいF()を返す
}
関数 inheritPrototype(サブタイプ、スーパータイプ) {
 let prototype = object(SuperType.prototype) //親クラスのプロトタイプのコピーを生成する //このインスタンスのコンストラクタをオーバーライドする
 prototype.constructor = サブタイプ

 //このオブジェクトのコピーをサブクラスのプロトタイプに割り当てます。SubType.prototype = prototype
}

関数SuperType(名前) {
	this.name = 名前;
	this.colors = ["赤","青","緑"];
}
SuperType.prototype.sayName = 関数() {
	コンソールにログ出力します。
};
関数 SubType(名前, 年齢) {
	SuperType.call(this、名前);
	this.age = 年齢;
}

//inheritPrototype 関数を呼び出してサブクラスのプロトタイプ値を割り当て、結合継承の問題を修正します。inheritPrototype(SubType, SuperType);

SubType.prototype.sayAge = function() {
	コンソールにログ出力します。
};

要約する

これで、js 継承の 6 つの方法についての記事は終了です。より関連性の高い js 継承コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

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

<<:  crontab 実行時間とシステム時間の不一致の解決方法

>>:  Alibaba Cloud Linux CentOS 7.2 で自作 MySQL のルートパスワードを忘れた場合の解決方法

推薦する

HTML ドロップダウン ボックスの SELECT オプションを変更する複数の方法

フォームが送信されると、返された HTML ページが再レンダリングされ、SELECT コントロールの...

VMware に Linux システム (Redhat8) と仮想マシンのネットワーク構成をインストールする方法

目次1. VMwareをインストールする1.1 VMwareworkstationsをダウンロードし...

JavaScript の便利な配列トリック 12 選

目次アレイ重複排除1. from() を新しい Set() メソッドに重ねる2. スプレッド演算子 ...

Windows 10 無料インストール版の MySQL インストールと設定のチュートリアル

ネットでいろいろ検索してみたところ、Linux システム向けではなく、現在の新しいバージョンと一致し...

docker-compsoe を使用してフロントエンドとバックエンドを分離したプロジェクトをデプロイする方法

事前に言っておくDocker を使用すると非常にシンプルなデプロイメント環境を実現できることは誰もが...

WeChatアプレットの入力レベルとテキストエリアレベルの浸透率が高すぎる問題の解決策

WeChat ミニプログラムのネイティブ コンポーネントであるカメラ、キャンバス、入力 (フォーカス...

DIV+CSS命名規則の詳細な説明はSEO最適化に役立ちます

1. CSSファイルの命名規則提案: 文字、_、-、数字を使用します。文字で始まる必要があり、純粋な...

背景画像にテキストを表示するためのCSS

効果: <div class="imgs"> <!-- 背景画...

ページングのどのページでMySQLのレコードをクエリするか

序文実際には、次のような問題に遭遇する可能性があります。特定のレコードの ID がわかっていて、その...

MySQL データベース データのロード 複数の用途

目次MySQL Load Dataの多様な用途1. LOAD の基本的な背景2. 基本パラメータをロ...

ウェブページのカラーマッチングにおけるオーバーラップとソフトカラーマッチングの手法を詳しく説明

この記事には、細かい点は一切なく、カラーマッチングのテクニックをシェアするだけです。とてもシンプルで...

Windows DNS サーバーに「ワームレベル」の脆弱性が露呈、17 年間存在

脆弱性の紹介SigRed の脆弱性はワーム化可能であるため非常に危険です。つまり、ユーザーの介入なし...

JPQLに基づく純粋なSQL文方式の詳細な説明

JPQL は Java Persistence Query Language の略です。 Java ...

MySQL 5.7 でルートパスワードを忘れた後に変更する方法の詳細なチュートリアル

序文長い間、MySQL のアプリケーションおよび学習環境は MySQL 5.6 以前のバージョンであ...

MySQL でサーバーのインストールを開始できない場合の解決策について簡単に説明します。

コンピュータに初めて MySQL をインストールする場合、通常このエラー メッセージは表示されません...