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()
なぜそうではないのですかa から継承するようにプロトタイプを設定しているにもかかわらず、b と c のコンストラクター プロパティが更新されました?
答え:
これを理解するために、概念的な旅に着手しましょう:
ここで、なぜコンストラクター プロパティがインスタンス オブジェクト自体に定義されていないのかという疑問が生じます。次の例を考えてみましょう:
function defclass(prototype) { var constructor = prototype.constructor; constructor.prototype = prototype; return constructor; } var Square = defclass({ constructor: function (side) { this.side = side; }, area: function () { return this.side * this.side; } }); var square = new Square(10); console.log(square.area()); // 100
この例では、コンストラクター プロパティは他のプロパティと同様にプロトタイプのメソッドです。ただし、これは特にプロトタイプのインスタンスを初期化するために使用されます。
プロトタイプでコンストラクター プロパティを定義すると、次のような利点があります。
継承とコンストラクター プロパティ
継承の場合、派生コンストラクターのプロトタイプ プロパティは、基本コンストラクターのインスタンスに設定されます。 。したがって、派生コンストラクター インスタンスの内部 [[proto]] プロパティも、基本コンストラクターのプロトタイプを指します。これにより、派生コンストラクター インスタンスのコンストラクター プロパティが基本コンストラクターを指すようになります。
instanceof 演算子
instanceof 演算子は、インスタンス オブジェクトとコンストラクター関数を操作します。一般に信じられていることに反して、インスタンスのコンストラクター プロパティには依存しません。代わりに、インスタンスのプロトタイプ チェーンを走査し、その内部の [[proto]] プロパティがコンストラクターのプロトタイプ プロパティと一致するかどうかを確認します。一致すると true が返されますが、プロトタイプ チェーンの終了では false が返されます。
以上がJavaScript の「constructor」プロパティがプロトタイプの継承中に更新されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。