これprototype
は、それ自体のプロパティではなく、コンストラクタ関数のプロパティであるためです。ただし、オブジェクトにはコンストラクターへの参照があるため、そのプロパティを介してprototype
オブジェクトにアクセスできます。prototype
constructor
function Foo() {}
Foo.prototype.foo = "bar";
var c = new Foo;
console.log( c.constructor === Foo ); // true
console.log( c.constructor.prototype ); // { foo: 'bar' }
prototype
ただし、コンストラクター関数の初期プロパティを上書きすると、これは機能しません。
function Foo() {}
// I overwrite the prototype property, so I lose the initial reference
// to the constructor.
Foo.prototype = {
foo: "bar"
};
var c = new Foo;
console.log( c.constructor === Foo ); // false
console.log( c.constructor === Object ); // true
console.log( c.constructor.prototype ); // {}
Object.getPrototypeOf
そのため、ES5 で導入された新しい方法を使用する方がよいでしょう。
function Foo() {}
Foo.prototype = {
foo: "bar"
};
var c = new Foo;
console.log( c.constructor === Foo ); // false
console.log( c.constructor === Object ); // true
console.log( c.constructor.prototype ); // {}
console.log( Object.getPrototypeOf(c) ); // { foo: 'bar' }
constructor
別の解決策は、プロトタイプの参照を確実に復元することでした。
function Foo() {}
// Overwriting the initial prototype
Foo.prototype = {
constructor: Foo, // restore the constructor reference
foo: "bar"
};