ホームページ ウェブフロントエンド jsチュートリアル JavaScript 継承のさまざまな方法とその長所と短所の詳細な紹介

JavaScript 継承のさまざまな方法とその長所と短所の詳細な紹介

May 14, 2017 am 10:12 AM

この記事では、JavaScript継承を深く理解するためのさまざまな方法と利点と欠点を主に紹介します。興味のある友人はそれを参照してください

前に書いています

。記事 JavaScriptのさまざまな継承方法とメリット・デメリット。

注:

は「JavaScript Deep

オブジェクトの作成」と同じで、メモに似ています。

ねえ、もう一度ため息をつきましょう。「JavaScript Advanced Programming」は本当によく書かれています。

1. プロトタイプチェーンの継承

function Parent () {
  this.name = 'kevin';
}

Parent.prototype.getName = function () {
  console.log(this.name);
}

function Child () {

}

Child.prototype = new Parent();

var child1 = new Child();

console.log(child1.getName()) // kevin
ログイン後にコピー

問題:

1.

参照typeのプロパティは、すべてのインスタンスによって共有されます。例: Childのインスタンスを作成するとき、次のようにします。パラメータを渡す

2.

コンストラクター

(古典的な継承)を借用する利点:

1. すべてのインスタンスによって共有される参照型属性を避けることができます2.子の中の親

例:

function Parent () {
  this.names = ['kevin', 'daisy'];
}

function Child () {

}

Child.prototype = new Parent();

var child1 = new Child();

child1.names.push('yayu');

console.log(child1.names); // ["kevin", "daisy", "yayu"]

var child2 = new Child();

console.log(child2.names); // ["kevin", "daisy", "yayu"]
ログイン後にコピー

短所:

メソッドはコンストラクターで定義され、インスタンスが作成されるたびにメソッドが作成されます。

3. 組み合わせ継承

プロトタイプチェーン継承とクラシック継承は二刀流を組み合わせたものです。

function Parent () {
  this.names = ['kevin', 'daisy'];
}

function Child () {
  Parent.call(this);
}

var child1 = new Child();

child1.names.push('yayu');

console.log(child1.names); // ["kevin", "daisy", "yayu"]

var child2 = new Child();

console.log(child2.names); // ["kevin", "daisy"]
ログイン後にコピー

利点: プロトタイプ チェーンの継承とコンストラクターの利点を組み合わせた、JavaScript で最も一般的に使用される継承パターンです。

4. プロトタイプの継承

function Parent (name) {
  this.name = name;
}

function Child (name) {
  Parent.call(this, name);
}

var child1 = new Child('kevin');

console.log(child1.name); // kevin

var child2 = new Child('daisy');

console.log(child2.name); // daisy
ログイン後にコピー

は、渡されたオブジェクトを作成されたオブジェクトのプロトタイプとして使用する、ES5 Object.create のシミュレートされた実装です。

欠点: 参照型を含む属性値は常に対応する値を共有します。これはプロトタイプチェーンの継承と同じです。

function Parent (name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];
}

Parent.prototype.getName = function () {
  console.log(this.name)
}

function Child (name, age) {

  Parent.call(this, name);
  
  this.age = age;

}

Child.prototype = new Parent();

var child1 = new Child('kevin', '18');

child1.colors.push('black');

console.log(child1.name); // kevin
console.log(child1.age); // 18
console.log(child1.colors); // ["red", "blue", "green", "black"]

var child2 = new Child('daisy', '20');

console.log(child2.name); // daisy
console.log(child2.age); // 20
console.log(child2.colors); // ["red", "blue", "green"]
ログイン後にコピー

注: 変更

は、プロトタイプの名前の値を変更するのではなく、名前の値を追加しました。

5. 寄生継承person1.name的值,person2.name的值并未发生改变,并不是因为person1person2有独立的 name 值,而是因为person1.name = 'person1',给person1

この関数は、継承プロセスをカプセル化するためにのみ使用される関数を作成し、内部的に何らかの形式でオブジェクトを返します。

function createObj(o) {
  function F(){}
  F.prototype = o;
  return new F();
}
ログイン後にコピー

短所: 借用したコンストラクター パターンと同様に、オブジェクトが作成されるたびにメソッドが作成されます。

6. 寄生結合継承

皆さんが読みやすいように、結合継承のコードをここで繰り返します:

var person = {
  name: 'kevin',
  friends: ['daisy', 'kelly']
}

var person1 = createObj(person);
var person2 = createObj(person);

person1.name = 'person1';
console.log(person2.name); // kevin

person1.firends.push('taylor');
console.log(person2.friends); // ["daisy", "kelly", "taylor"]
ログイン後にコピー

結合継承の最大の欠点は、親コンストラクターが 2 回呼び出されることです。

サブタイプ インスタンスのプロトタイプを設定するときに 1 回:

function createObj (o) {
  var clone = object.create(o);
  clone.sayName = function () {
    console.log('hi');
  }
  return clone;
}
ログイン後にコピー

サブタイプ インスタンスを作成するときに 1 回:

function Parent (name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];
}

Parent.prototype.getName = function () {
  console.log(this.name)
}

function Child (name, age) {
  Parent.call(this, name);
  this.age = age;
}

Child.prototype = new Parent();

var child1 = new Child('kevin', '18');

console.log(child1)
ログイン後にコピー

new のシミュレーション実装を思い出してください。実際、この文では、次のように実行します:

Child.prototype = new Parent();
ログイン後にコピー

ここでは、親コンストラクターを再度呼び出します。

つまり、この例では、child1 オブジェクトを出力すると、Child.prototype と child1 の両方に color という属性があり、その属性値は ['red', 'blue', 'green' であることがわかります。 ]。

では、今回はどうすれば改善を続け、繰り返しの呼び出しを回避できるでしょうか?

Child.prototype = new Parent() を使用せず、間接的に Child.prototype が Parent.prototype にアクセスできるようにしたらどうなるでしょうか?

それを実装する方法を見てみましょう:

var child1 = new Child('kevin', '18');
ログイン後にコピー

最後に、この継承メソッドをカプセル化しましょう:

Parent.call(this, name);
ログイン後にコピー

「JavaScript 高度なプログラミング」の寄生結合継承の賞賛を引用します:

このメソッドの効率の高さは、呼び出しのみであることを反映しています。 Parent コンストラクターは一度作成されるため、Parent.prototype に不要で冗長なプロパティが作成されることが回避されます。同時に、プロトタイプ チェーンは変更されないため、instanceof と isPrototypeOf は通常どおり使用できます。開発者は一般に、寄生構成継承が参照型にとって最も理想的な継承パラダイムであると信じています。

以上がJavaScript 継承のさまざまな方法とその長所と短所の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C++関数継承の詳しい解説:継承で「基底クラスポインタ」と「派生クラスポインタ」を使うには? C++関数継承の詳しい解説:継承で「基底クラスポインタ」と「派生クラスポインタ」を使うには? May 01, 2024 pm 10:27 PM

関数の継承では、「基底クラス ポインター」と「派生クラス ポインター」を使用して継承メカニズムを理解します。基底クラス ポインターが派生クラス オブジェクトを指す場合、上方変換が実行され、基底クラスのメンバーのみにアクセスされます。派生クラス ポインターが基本クラス オブジェクトを指す場合、下向きキャストが実行される (安全ではない) ため、注意して使用する必要があります。

システム購入前に必ずお読みください: Win11 と Win10 の長所と短所の分析 システム購入前に必ずお読みください: Win11 と Win10 の長所と短所の分析 Mar 28, 2024 pm 01:33 PM

情報化社会の今日、パソコンは私たちの生活に欠かせないツールとして重要な役割を果たしています。オペレーティング システムはコンピュータの中核ソフトウェアの 1 つであり、私たちの使用体験や作業効率に影響を与えます。市場では、Microsoft の Windows オペレーティング システムが常に支配的な地位を占めており、現在、人々は最新の Windows 11 と古い Windows 10 の選択に直面しています。一般の消費者は、オペレーティング システムを選択するときに、バージョン番号だけではなく、その長所と短所も理解します。

テンプレートのメリットとデメリットは何ですか? テンプレートのメリットとデメリットは何ですか? May 08, 2024 pm 03:51 PM

テンプレート化: 長所と短所 テンプレート化は、再利用可能なコード ブロックを作成できる強力なプログラミング手法です。これにはさまざまな利点がありますが、いくつかの欠点もあります。長所: コードの再利用性: テンプレートを使用すると、アプリケーション全体で再利用できる共通のコードを作成できるため、重複やメンテナンスの労力が軽減されます。一貫性: テンプレート化により、コード スニペットが異なる場所でも同じ方法で実装されるようになり、コードの一貫性と読みやすさが向上します。保守性: テンプレートへの変更は、それを使用するすべてのコードに同時に反映されるため、保守と更新が簡素化されます。効率: テンプレートを作成すると、同じコードを何度も記述する必要がないため、時間と労力が節約されます。柔軟性: テンプレートを使用すると、さまざまなアプリケーションのニーズに簡単に適応できる構成可能なコード ブロックを作成できます。欠点がある

Java サーブレットの仕組みの長所と短所は何ですか? Java サーブレットの仕組みの長所と短所は何ですか? Apr 16, 2024 pm 03:18 PM

JavaServlet は、動的 Web ページの構築に使用される Java クラスで、クライアントとサーバー間のブリッジとして機能します。動作原理: リクエストの受信、サーブレットの初期化、リクエストの処理、応答の生成、サーブレットの終了。長所: ポータブル、拡張性があり、安全で使いやすい。短所: オーバーヘッド、結合、および状態管理。実際のケース: 「Hello, Servlet!」メッセージを表示する単純なサーブレットを作成します。

PHP フレームワークの長所と短所の比較: どちらが優れていますか? PHP フレームワークの長所と短所の比較: どちらが優れていますか? Jun 04, 2024 pm 03:36 PM

PHP フレームワークの選択は、プロジェクトのニーズと開発者のスキルによって異なります。 Laravel: 豊富な機能と活発なコミュニティがありますが、学習曲線が急で、パフォーマンスのオーバーヘッドが高くなります。 CodeIgniter: 軽量で拡張が簡単ですが、機能が制限されており、ドキュメントが少なくなります。 Symfony: モジュール式の強力なコミュニティですが、複雑なパフォーマンスの問題があります。 ZendFramework: エンタープライズ グレードで、安定性と信頼性が高くなりますが、ライセンスが大きく高価です。スリム: マイクロフレームワークで高速ですが、機能が限られており、学習曲線が急です。

継承とポリモーフィズムは C++ のクラス結合にどのような影響を与えますか? 継承とポリモーフィズムは C++ のクラス結合にどのような影響を与えますか? Jun 05, 2024 pm 02:33 PM

継承とポリモーフィズムはクラスの結合に影響します。派生クラスは基本クラスに依存するため、継承により結合が増加します。ポリモーフィズムにより、オブジェクトは仮想関数と基本クラス ポインターを通じて一貫した方法でメッセージに応答できるため、結合が軽減されます。ベスト プラクティスには、継承を控えめに使用すること、パブリック インターフェイスを定義すること、基本クラスへのデータ メンバーの追加を回避すること、依存関係の注入を通じてクラスを分離することが含まれます。ポリモーフィズムと依存性注入を使用して銀行口座アプリケーションの結合を軽減する方法を示す実践的な例。

C言語とPython:適用可能なシナリオとメリットとデメリットの分析 C言語とPython:適用可能なシナリオとメリットとデメリットの分析 Mar 22, 2024 am 11:24 AM

C 言語と Python: 適用可能なシナリオと長所と短所の分析 コンピューター プログラミングの分野では、C 言語と Python は非常に人気のある 2 つのプログラミング言語ですが、それぞれに独自の長所と短所があり、さまざまなシナリオに適しています。この記事では、C 言語と Python を詳細に分析し、適用可能なシナリオ、利点と欠点について説明します。 1. C 言語の適用シナリオ: C 言語は、高効率で優れたパフォーマンスを備えたプロセス指向のプログラミング言語であり、高度な制御と効率が要求されるシステム ソフトウェア、ドライバー、組み込みシステムの開発に適しています。

C++ 関数の継承の詳細な説明: 継承のエラーをデバッグするには? C++ 関数の継承の詳細な説明: 継承のエラーをデバッグするには? May 02, 2024 am 09:54 AM

継承エラーのデバッグのヒント: 正しい継承関係を確認します。デバッガーを使用してコードをステップ実行し、変数値を調べます。仮想修飾子を正しく使用してください。隠れた相続によって引き起こされる相続ダイアモンド問題を調べてください。抽象クラスに実装されていない純粋仮想関数がないか確認します。

See all articles