obj.constructor.prototype を使用してオブジェクトのプロトタイプにアクセスできる場合
一般にはできません。このアプローチがどのように機能するかを検討してください。
var proto = MyConstructor.prototype;
// has an (nonenumberable) property "constructor"
proto.hasOwnProperty("constructor"); // `true`
// that points [back] to
proto.constructor; // `function MyConstructor() {…}`
ご覧のとおり、これは循環型のプロパティ構造です。あなたがするとき
var o = new MyConstructor();
// and access
o.constructor; // `function MyConstructor() {…}`
// then it yields the value that is inherited from `proto`
// as `o` doesn't have that property itself:
o.hasOwnProperty("constructor"); // `false`
しかし、それはプロトタイプオブジェクトからプロパティo
を継承しconstructor
、プロトタイプオブジェクトを指す何かを持つ有用な値を持つようなオブジェクトに対してのみ機能します。のことを考える
var o = {};
o.constructor = {prototype: o};
おっとっと。ここでアクセスするとそれ自体o.constructor.prototype
が生成o
され、他の無意味な値になる可能性があります。構造は実際には上記と同じで、MyConstructor.prototype
- にアクセスproto.constructor.prototype.constructor.prototype[.constructor.prototype…]
すると、proto
.
obj.constructor.prototype.constructor.prototype
では、プロトタイプチェーンをトラバースするために使用できず、使用する必要があるのはなぜObject.getPrototypeOf
ですか?
MyConstructor.prototype
) にはそのconstructor
プロパティ自体があり、 から継承されていないため、循環構造に閉じ込められているためですObject.prototype
。次のオブジェクトを実際に真のプロトタイプ チェーンにするには、 を使用する必要がありますObject.getPrototypeOf
。
var o = new MyConstructor();
console.log(o.constructor.prototype) // MyConstructor
MyConstructor.prototype
実際にあったはずです。ただし、Chrome コンソールは、名前のないオブジェクトの有用なタイトルを表示する際に混乱することがあり、常に正しいとは限りません。
プロトタイプを取得すると、yield が生成され、関数自体Object.prototype
のプロトタイプを取得すると、が生成されます。後者をもう一度実行できることに注意してください…</p>
MyConstructor
Function.prototype
MyConstructor.constructor.prototype