Chrome DevTools コンソールのインライン (非拡張) オブジェクト表現では、現在、独自のプロパティと継承されたプロトタイプ プロパティの違いは表示されません。
では、何が起こっているのかを小さなステップに分けてみましょう。
new foo()
内部proto
プロパティが を指す新しいオブジェクトを作成しfoo.prototype
ます。これは、このオブジェクトが で定義されているすべてのプロパティにアクセスできることを意味しますfoo.prototype
。プロトタイプチェーンと呼ばれます。
オブジェクトに同じ名前のプロパティを設定すると、プロトタイプのプロパティが同じ名前で「シャドウ」され、通常のプロパティ アクセスでは後者にアクセスできなくなります (シャドウされたプロトタイプ プロパティにアクセスするために使用する @loxxy の回答を参照してくださいObject.getPrototypeOf(obj)
)。
関数をオブジェクトまたはそのプロトタイプに追加すると、コンソールで拡張オブジェクト表現を表示できますが、これはプロトタイプ プロパティとは独自のプロパティが異なります。q
次の例では、この動作を可能にするメソッドをプロトタイプに追加しました。プロトタイプから継承されたプロパティは、オブジェクトのproto
内部プロパティ内に表示されます。

コンストラクターのプロトタイプにインスタンス化されたオブジェクトの数だけが必要な場合は、次を使用できます。
var foo = function() {
Object.getPrototypeOf(this).p++;
}
foo.prototype.p = 0;
console.log(new foo()); //{p: 1}
console.log(new foo()); //{p: 2}
または ES5 依存関係なし:
var foo = function() {
foo.prototype.p++;
}
foo.prototype.p = 0;
console.log(new foo()); //{p: 1}
console.log(new foo()); //{p: 2}