ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript のコンストラクター プロパティがプロトタイプの継承で更新されないのはなぜですか?

JavaScript のコンストラクター プロパティがプロトタイプの継承で更新されないのはなぜですか?

DDD
リリース: 2024-12-06 18:34:12
オリジナル
577 人が閲覧しました

Why Doesn't JavaScript's Constructor Property Update in Prototypal Inheritance?

JavaScript の継承とコンストラクター プロパティについて理解する

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート