JavaScript では、継承とは、既存のオブジェクトからプロパティとメソッドを継承する新しいオブジェクトを作成するプロセスを指します。継承に関してよく疑問が生じる側面の 1 つは、コンストラクター プロパティの動作です。
次のコードを考えてみましょう。
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?
関数インスタンスのコンストラクター プロパティは、関数自体を指します。この場合、a()、b()、および c() はすべて関数インスタンスであるため、それらのコンストラクター プロパティはそれらを参照します。 b.prototype と c.prototype をそれぞれ a() と b() のインスタンスに設定すると、基本的に b と c のプロトタイプ チェーンが変更されますが、コンストラクター プロパティは変更されません。
継承のやり方が間違っているのでしょうか?
いいえ、必ずしも継承のやり方が間違っているわけではありません。この動作は、JavaScript のプロトタイプ継承の意図された結果です。 JavaScript での継承には、派生クラス (b や c など) のプロトタイプ プロパティを基本クラス (a など) のインスタンスまたはそのプロトタイプ オブジェクトに設定することが含まれます。これではコンストラクター プロパティは更新されません。
コンストラクター プロパティを更新する最良の方法は何ですか?
コンストラクター プロパティを手動で更新する 1 つの方法は、派生プロパティを割り当てることです。コンストラクター関数をプロトタイプ オブジェクトのコンストラクター プロパティとして使用します。ただし、これは必ずしも必要なわけではなく、カスタム オブジェクト タイプのコンストラクターで混乱が生じる可能性があります。
このコンテキストでは、instanceof 演算子はどのように機能しますか?
instanceof 演算子は以下をチェックします。オブジェクトが特定のコンストラクター関数のインスタンスである場合。この場合、b と c のインスタンスのコンストラクター プロパティが a() に設定されていても、instanceof 演算子はプロトタイプ チェーンを走査することで、それらを b と c のインスタンスとして正しく識別します。
この走査プロセスは、プロトタイプ チェーン内の各オブジェクトの内部 [[proto]] プロパティをコンストラクター関数のプロトタイプ プロパティに変換します。一致するものが見つかった場合、instanceof 演算子は true を返します。それ以外の場合は false を返します。
コンストラクターのプロパティと継承の複雑さを理解することは、効果的な JavaScript 開発にとって重要です。プロトタイプ継承の制限と影響を考慮することで、適切に設計された保守しやすいコードを作成できます。
以上がプロトタイプの継承中に JavaScript のコンストラクター プロパティが更新されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。