すべてのコンストラクタは、グローバルFunction
オブジェクトのインスタンスである:
function Foo(){ this.x = 1 }; // Dummy constructor function
console.log(Foo instanceof Function) // => true; Foo is an instance of global Function constructor
すべてのプロトタイプは、グローバルObject
オブジェクトのインスタンスである:コンストラクタFoo
が定義されている場合は
console.log(Foo.prototype instanceof Object); // => true
、それが自動的にFoo.prototype
を持っています上記のように、それ自体が "空の"オブジェクトと考えることができるオブジェクトは、グローバルObject
オブジェクトから継承します。言い換えれば、Foo.prototype
のプロトタイプはObject.prototype
です:
function Foo(){ this.x = 1 }; // Dummy constructor function
console.log(Foo.prototype); // Foo (object); already exists
console.log(Object.getPrototypeOf(Foo.prototype) === Object.prototype); // => true
Foo.prototype
が空白のオブジェクトであるので、1はそのコンストラクタがグローバルObject
コンストラクタ関数であることを期待する:
function Foo(){ this.x = 1 }; // Dummy constructor function
console.log(Foo.prototype.constructor) // => function Foo() { this.x = 1; } ??
console.log(Foo.prototype.constructor === Object.prototype.constructor); // => false
しかし、この「空白」オブジェクトには明示的な自己参照constructor
プロパティがあり、これはfunction Foo(){ this.x = 1 }
を指し、期待しているデフォルトのコンストラクタプロパティを上書きまたはマスクします。
function Foo(){ this.x = 1 }; // Dummy constructor function
delete Foo.prototype.constructor; // Delete explicit constructor property
console.log(Foo.prototype.constructor) // => function Object() { [native code] }
console.log(Foo.prototype.constructor === Object.prototype.constructor); // => true
したがって、obj.constructor.prototype
を再帰的に使用してプロトタイプチェーンをトラバースすることはできず、Object.getPrototypeOf()
メソッドに依存する必要があります。
ここは素晴らしいvisual referenceです。