JavaScript の継承とコンストラクター プロパティについて
提供されているコード スニペットは、JavaScript での継承を示しています。ただし、コンストラクター プロパティと instanceof 演算子についても疑問が生じます。
b と c のコンストラクター プロパティが更新されないのはなぜですか?
b.prototype を次のように設定する場合new a() では、a のプロトタイプ オブジェクトが b のプロトタイプになります。これにより b のコンストラクター プロパティは更新されず、関数 b のままになります。同様に、c は b から継承するため、最終的に a を指す b のコンストラクターも継承します。
継承メカニズムに欠陥がありますか?
いいえ、継承メカニズムは正しいです。 。 JavaScript では、コンストラクター プロパティはプロトタイプ オブジェクトのプロパティであり、インスタンス自体ではありません。インスタンスを作成するとき、内部 [[proto]] プロパティはコンストラクター関数自体ではなく、コンストラクターのプロトタイプを指します。
コンストラクター プロパティの更新
コンストラクターのプロパティを更新するには、次のパターンを使用できます。
function Square(side) { if (this instanceof Square) { this.side = side; } else { return new Square(side); } }
理解instanceof
instanceof 演算子は、インスタンスのコンストラクター プロパティに依存しません。代わりに、インスタンス オブジェクトのプロトタイプ チェーンにコンストラクター関数のプロトタイプが含まれているかどうかを確認します。指定されたコード:
c.prototype = new b(); console.log(new c() instanceof c); // true
(new c()) のコンストラクター プロパティが a() を指している場合でも、instanceof はプロトタイプ チェーンをチェックし、プロトタイプ チェーンが c のインスタンスとして正しく識別します。 include c.prototype.
結論
JavaScript での継承には設定が必要です派生コンストラクターのプロトタイプを基本コンストラクターのインスタンスに変換します。コンストラクターのプロパティはプロトタイプ オブジェクトのプロパティのままであり、instanceof 演算子はプロトタイプ チェーンをチェックして、インスタンスが特定のコンストラクターに属しているかどうかを判断します。
以上がJavaScript の継承メカニズムがコンストラクター プロパティを自動的に更新しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。