ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript の継承メカニズムがコンストラクター プロパティを自動的に更新しないのはなぜですか?

JavaScript の継承メカニズムがコンストラクター プロパティを自動的に更新しないのはなぜですか?

DDD
リリース: 2024-12-04 15:07:11
オリジナル
226 人が閲覧しました

Why Doesn't JavaScript's Inheritance Mechanism Automatically Update the Constructor Property?

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

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