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

JavaScript の「constructor」プロパティがプロトタイプの継承中に更新されないのはなぜですか?

Barbara Streisand
リリース: 2024-12-01 05:05:17
オリジナル
633 人が閲覧しました

Why Doesn't JavaScript's `constructor` Property Update During Prototypal Inheritance?

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 Foo() {} のような関数を作成すると、JavaScript は内部で Function インスタンス (コンストラクター) を作成します。
  • 各コンストラクター関数には、そのプロトタイプ オブジェクトへのポインターであるプロトタイプ プロパティがあります。
  • プロトタイプ オブジェクトには、そのコンストラクター関数を指すコンストラクター プロパティがあります。
  • new Foo() を使用して Foo の新しいインスタンスを作成すると、新しいオブジェクトが作成され、その内部の [[proto]] プロパティはそのプロトタイプを指します。 constructor.

ここで、なぜコンストラクター プロパティがインスタンス オブジェクト自体に定義されていないのかという疑問が生じます。次の例を考えてみましょう:

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
ログイン後にコピー

この例では、コンストラクター プロパティは他のプロパティと同様にプロトタイプのメソッドです。ただし、これは特にプロトタイプのインスタンスを初期化するために使用されます。

プロトタイプでコンストラクター プロパティを定義すると、次のような利点があります。

  • 論理的な正確性: 例: Object.prototype.constructorオブジェクトを指します。インスタンス上で定義されている場合、null のインスタンスであるため、Object.prototype に対しては未定義になります。
  • 他のプロトタイプ メソッドとの一貫性: これにより、定義する必要のない new の実装が簡素化されます。各インスタンスのコンストラクター プロパティ。
  • 効率: すべてのインスタンスが同じコンストラクター プロパティを共有し、メモリを削減します。

継承とコンストラクター プロパティ

継承の場合、派生コンストラクターのプロトタイプ プロパティは、基本コンストラクターのインスタンスに設定されます。 。したがって、派生コンストラクター インスタンスの内部 [[proto]] プロパティも、基本コンストラクターのプロトタイプを指します。これにより、派生コンストラクター インスタンスのコンストラクター プロパティが基本コンストラクターを指すようになります。

instanceof 演算子

instanceof 演算子は、インスタンス オブジェクトとコンストラクター関数を操作します。一般に信じられていることに反して、インスタンスのコンストラクター プロパティには依存しません。代わりに、インスタンスのプロトタイプ チェーンを走査し、その内部の [[proto]] プロパティがコンストラクターのプロトタイプ プロパティと一致するかどうかを確認します。一致すると true が返されますが、プロトタイプ チェーンの終了では false が返されます。

以上がJavaScript の「constructor」プロパティがプロトタイプの継承中に更新されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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