Javascriptオブジェクト指向プログラミング(2)constructor_jsオブジェクト指向の継承
今回紹介したいのは、複数のオブジェクトを「継承」するインスタンスを生成する方法です。
たとえば、「animal」オブジェクトのコンストラクターが追加されました。
function Animal(){
this.species = "Animal";
}
「猫」オブジェクトのコンストラクタもあります,
Function Cat(name,color){
this.name = name;
this.color = color;
1. コンストラクターのバインディング
最も簡単な方法は、おそらく、call または apply メソッドを使用して、親オブジェクトのコンストラクターを子オブジェクトにバインドすることです。つまり、子オブジェクトのコンストラクターで追加します。関数への行:
Animal.apply(this, argument);
this.name = name;
}
var cat1 = new Cat(" ","黄");
alert(cat1.species); // 動物
より一般的なアプローチは、プロトタイプ属性。
「cat」のプロトタイプ オブジェクトが Animal のインスタンスを指している場合、「cat」のすべてのインスタンスは Animal を継承できます。
var cat1 = new Cat("Big Hair", "Yellow")
alter(cat1.species); // 動物
コード 最初の行では、Cat のプロトタイプ オブジェクトが Animal インスタンスを指すようにしています。
プロトタイプオブジェクトの元の値を完全に削除してから、新しい値を代入することと同じです。しかし、2行目は何を意味するのでしょうか?
Cat.prototype.constructor = Cat;
すべてのプロトタイプ オブジェクトには、そのコンストラクターを指すコンストラクター属性があることがわかります。つまり、Cat.prototype オブジェクトのコンストラクター プロパティは Cat を指します。
前のステップでこのプロトタイプ オブジェクトの元の値を削除したため、新しいプロトタイプ オブジェクトにはコンストラクター属性がないため、手動で追加する必要があります。そうしないと、後で「継承チェーン」に問題が発生します。これが 2 行目の意味です。
つまり、これは非常に重要な点であり、プログラミング時に必ず従わなければなりません。この点の後には次のようになります。つまり、プロトタイプ オブジェクトが置き換えられる場合、
o.prototype = {};
次に、コンストラクター属性を新しいプロトタイプ オブジェクトに追加し、この属性をポイントし直す必要があります。元のコンストラクターに。
o.prototype.constructor = o;
3. プロトタイプを直接継承する
Animal オブジェクトでは、変更されていない属性を Animal.prototype に直接書き込むことができます。したがって、Cat() に Animal() をスキップさせて、Animal.prototype を直接継承させることもできます。
さて、まず Animal オブジェクトを書き直しましょう:
次に、Cat のプロトタイプ オブジェクトを Animal のプロトタイプ オブジェクトにポイントすることで、継承。
alter(cat1.species); // 動物
前の方法と比較して、この方法の利点は、より効率的であり (Animal のインスタンスを実行して作成する必要がない)、メモリを節約できることです。欠点は、Cat.prototype と Animal.prototype が同じオブジェクトを指すようになったため、Cat.prototype への変更が Animal.prototype に反映されることです。
つまり、上記のコードには実際には問題があります。 2 行目を見てください。
Cat.prototype.constructor = Cat;
この文は実際に Animal.prototype オブジェクトのコンストラクター プロパティを変更します。
alert(Animal.prototype.constructor); // Cat
4. 空のオブジェクトを仲介として使用する
「プロトタイプを直接継承」には上記の欠点があるため、空のオブジェクトを使用できます。オブジェクト オブジェクトは仲介者として機能します。
var F = function(){};
F.prototype = Animal.prototype;
Cat.prototype = new F();
Cat.prototype.constructor = Cat;
F は空のオブジェクトですメモリはほとんど必要としません。この時点では、Cat のプロトタイプ オブジェクトを変更しても、Animal のプロトタイプ オブジェクトには影響しません。
alert(Animal.prototype.constructor); // Animal
5. プロトタイプモードのカプセル化関数
使いやすくするために、上記のメソッドを関数にカプセル化します。
Function extend(Child, Parent) {
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype.constructor = Child; uber = Parent .prototype; }
使用時のメソッドは次のとおりです
この拡張関数は、YUI ライブラリが継承を実装する方法です。
あと、ちょっと説明させてください。関数本体の最後の行
Child.uber = Parent.prototype;
6. 継承のコピー
上記では、プロトタイプ オブジェクトを使用して継承を実装しています。また、考え方を変えて、純粋に「コピー」メソッドを使用して継承を実装することもできます。簡単に言えば、親オブジェクトのプロパティやメソッドをすべて子オブジェクトにコピーすれば、継承も実現できるのではないでしょうか?
まず、Animal の不変プロパティをすべてそのプロトタイプ オブジェクトに配置します。
コードをコピー
次に、属性コピーの目的を達成するための関数を書きます。
コードをコピー
c[i] =
c.uber = p;
}
この関数の機能は、親オブジェクトのプロトタイプ オブジェクトの属性を子オブジェクトのプロトタイプ オブジェクトに 1 つずつコピーすることです。
を使用する場合は、次のように記述します:
コードをコピー
まだ終わっていないので、パート 3「非コンストラクターの継承」を読み続けてください。
(終わり)

ホット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)

ホットトピック









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

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

PHP エラーの解決: 親クラスの継承時に発生する問題 PHP では、継承はオブジェクト指向プログラミングの重要な機能です。継承により、元のコードを変更することなく、既存のコードを再利用し、拡張および改善できます。継承は開発で広く使用されていますが、親クラスから継承するときにエラーの問題が発生することがあります。この記事では、親クラスから継承するときに発生する一般的な問題の解決に焦点を当て、対応するコード例を示します。質問 1: 親クラスが見つかりません。親クラスの継承処理中に、システムが親クラスを見つからない場合、

継承は、あるクラスのプロパティと動作に別のクラスからアクセスできるようにする概念です。メソッドやメンバ変数を継承するクラスをスーパークラスまたは親クラスと呼び、メソッドやメンバ変数を継承するクラスをサブクラスまたはサブクラスと呼びます。 Javaでは、クラスを継承するために「extends」キーワードを使用します。この記事では、相続を利用して定期預金や定期預金の利息を計算する Java プログラムについて説明します。まず、ローカル マシンの IDE でこれら 4 つの Java ファイル Acnt.java を作成します。このファイルには、金利や金額などの口座詳細を保存するために使用される抽象クラス「Acnt」が含まれます。また、計算用のパラメータ「amnt」を持つ抽象メソッド「calcIntrst」も含まれます。

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

PHP のカプセル化テクノロジとアプリケーションのカプセル化は、オブジェクト指向プログラミングにおける重要な概念であり、外部プログラムに統一されたアクセス インターフェイスを提供するために、データとデータに対する操作を一緒にカプセル化することを指します。 PHP では、アクセス制御修飾子とクラス定義を通じてカプセル化を実現できます。この記事では、PHP のカプセル化テクノロジとそのアプリケーション シナリオを紹介し、いくつかの具体的なコード例を示します。 1. カプセル化されたアクセス制御修飾子 PHP では、カプセル化は主にアクセス制御修飾子によって実現されます。 PHP には 3 つのアクセス制御修飾子が用意されています。

Javaを使用してプロキシ最終クラスの継承を強制するにはどうすればよいですか? Java では、final キーワードはクラス、メソッド、変数を変更するために使用され、継承、オーバーライド、または変更できないことを示します。ただし、場合によっては、特定のニーズを達成するために、最終クラスの継承を強制する必要がある場合があります。この記事では、プロキシ パターンを使用してそのような機能を実装する方法について説明します。プロキシ パターンは、別のオブジェクト (プロキシ オブジェクト) の動作を制御できる中間オブジェクト (プロキシ オブジェクト) を作成できるようにする構造設計パターンです。

C++の関数継承を詳しく解説:「is-a」と「has-a」の関係をマスターしよう 関数継承とは?関数の継承は、派生クラスで定義されたメソッドを基本クラスで定義されたメソッドに関連付ける C++ の手法です。これにより、派生クラスが基本クラスのメソッドにアクセスしてオーバーライドできるようになり、基本クラスの機能が拡張されます。 「is-a」および「has-a」関係 関数継承では、「is-a」関係は、派生クラスが基本クラスのサブタイプであること、つまり、派生クラスが基本クラスの特性と動作を「継承」することを意味します。基本クラス。 「has-a」関係は、派生クラスに基本クラス オブジェクトへの参照またはポインターが含まれていること、つまり、派生クラスが基本クラス オブジェクトを「所有」していることを意味します。構文関数継承を実装する方法の構文は次のとおりです: classDerivedClass:pu
