1. ホーム
  2. javascript

[解決済み] Javascriptのコンストラクタのプロパティの意味は何ですか?

2022-08-23 23:22:26

質問

Javascript の OO に関する考え方を理解しようとしているところです。 constructor プロパティについて混乱しています。特に constructor プロパティの意味を知りたいのですが、どうにもうまくいきません。例えば

function Foo(age) {
    this.age = age;
}

function Bar() {
    Foo.call(this, 42);
    this.name = "baz"; 
}

Bar.prototype = Object.create(Foo.prototype); 
var b = new Bar;    

alert(b.constructor); // "Foo". That's OK because we inherit `Foo`'s prototype.
alert(b.name);        // "baz". Shows that Bar() was called as constructor.
alert(b.age);         // "42", inherited from `Foo`.

上記の例では、オブジェクト b は正しいコンストラクタが呼び出されたようです ( Bar ) - そして、age プロパティを Foo . では、なぜ多くの人がこれを必要な手順として提案するのでしょうか。

Bar.prototype.constructor = Bar;

明らかに、右の Bar コンストラクタ を構築する際に呼び出されます。 b このプロトタイプ プロパティにはどのような影響があるのでしょうか。オブジェクトが作成された後にどのコンストラクタが実際に呼び出されるかに影響を与えるとは思えないので、コンストラクタ プロパティを「正しく」設定することが実際にどのような違いを生むのかを知りたいと思っています。

どのように解決するのですか?

2020年9月更新

下記の回答はECMAScript3の頃のもので、ECMAScript6以降、前段は事実ではなくなっています。 constructor プロパティが数カ所で使用されているからです。しかし、全体的な要点は今でも当てはまると思います。コメントで指摘してくれた T. J. Crowder に感謝します。現在の状況の全体像については、彼の回答を読んでください。

元の回答

その constructor プロパティは、内部的には何の実用的な違いもありません。コードが明示的にそれを使用する場合にのみ、それが役に立ちます。たとえば、各オブジェクトに、それを作成した実際のコンストラクタ関数への参照を持たせる必要があると判断した場合。 constructor プロパティを明示的に設定する必要があります。 prototype プロパティにオブジェクトを代入して継承を設定する場合です。