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
参照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
的值并未发生改变,并不是因为person1
和person2
有独立的 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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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