JavaScript では、継承はプロトタイプ継承によって実現され、オブジェクトはプロトタイプ チェーンを通じて他のオブジェクトからプロパティとメソッドを継承します。コンストラクター プロパティは、このメカニズムで重要な役割を果たします。
継承とコンストラクター プロパティ
次のコードを考えてみましょう。
function a() {} function b() {} function c() {} b.prototype = new a(); c.prototype = new b(); console.log((new a()).constructor); //a() console.log((new b()).constructor); //a() console.log((new c()).constructor); //a()
なぜb と c のコンストラクターが更新されていませんか?これは、JavaScript ではコンストラクター プロパティがインスタンスに直接割り当てられないためです。代わりに、プロトタイプ オブジェクト上に存在します。オブジェクトを作成したコンストラクター関数への参照を保存します。上の例では、b と c のプロトタイプが a のインスタンスに設定されているため、3 つのインスタンスすべてのコンストラクターが a() として報告されます。
コンストラクターを更新するためのベスト プラクティス
継承されたクラスのコンストラクター プロパティを更新するには、一般的なアプローチは中間メソッドを使用することです。 function:
function base() {} function derive() { derive.superclass = base.prototype; derive.prototype = new derive.superclass(); derive.prototype.constructor = derive; }
この手法により、派生インスタンスのコンストラクター プロパティが派生関数に正しく設定されるようになります。
Instanceof とプロトタイプ チェーン
(new c()).constructor が a() と等しい場合でも、instanceof は正しくnew c() を c のインスタンスとして識別します。これは、instanceof がインスタンス オブジェクトのプロトタイプ チェーンをチェックするためです。この場合、new c() のプロトタイプ チェーンは c プロトタイプに戻ります。
console.log(new a() instanceof a); //true console.log(new b() instanceof b); //true console.log(new c() instanceof c); //true
結論
JavaScript の継承とコンストラクター プロパティの相互作用は次のようになります。複雑ですが、JavaScript で効果的なオブジェクト指向プログラミングを行うには、それらを理解することが重要です。この記事で概説されている概念を理解することで、継承とプロトタイプ チェーンを効果的に活用する堅牢で再利用可能なコードを作成できます。
以上がJavaScript のコンストラクター プロパティがプロトタイプの継承で更新されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。