JavaScriptのすべての通常のオブジェクトには、内部プロトタイプスロットがあります(注:ここでのプロトタイプは、プロトタイププロパティを参照していません)。ECMAScript標準(http://www.ecma-international.org/ecma-262/6.0/index.html)は、このスロットが[[Prototype]]と呼ばれることを指定しています。このスロットには、__proto__プロパティを介してアクセスできます。
__proto__は、ブラウザ間で確実に利用できない場合があります。__proto__はECMAScript6の公式プロパティになります
ただし、プロトタイププロパティは、構築されたオブジェクトの__proto__プロパティになるものを設定するコンストラクター関数のプロパティです。
特定のタイプのプロトタイププロパティにアクセスできます。たとえば、コアJavaScriptタイプ(Date、Arrayなど)にアクセスできます。また、JavaScript関数(コンストラクターと見なすことができます)には、パブリックプロトタイププロパティがあります。ただし、関数のインスタンスにはプロトタイププロパティがありません。
あなたの場合var b = new x();
、、bは関数xのインスタンスです。したがって、b.prototypeは未定義です。ただし、bには内部[[Prototype]]スロットがあります。b.__proto__
Google Chrome(バージョン63.0.3239.132など)またはFirefox(バージョン43.0.4など)で出力する場合
console.log(b.__proto__);
[[Prototype]]スロットは次のように表示されます。
{log: ƒ, constructor: ƒ}
それでおしまい。
参考までに、コードスニペット全体を次のように配置します。
var x = function() {
};
x.prototype.log = function() {
console.log("1");
}
var b = new x();
b.log(); // 1
console.log(b.prototype); // undefined
console.log(b.__proto__); // {log: ƒ, constructor: ƒ}
console.log(x.prototype); // {log: ƒ, constructor: ƒ}