Das liegt daran, dass prototype
ist eine Eigenschaft der Konstruktorfunktion, nicht eine Eigenschaft des Konstruktors selbst. Allerdings ist die prototype
Objekt hat einen Verweis auf den Konstruktor, so dass Sie auf den Konstruktor eines Objekts zugreifen können. prototype
über seine constructor
Eigentum:
function Foo() {}
Foo.prototype.foo = "bar";
var c = new Foo;
console.log( c.constructor === Foo ); // true
console.log( c.constructor.prototype ); // { foo: 'bar' }
Dies funktioniert jedoch nicht, wenn Sie die ursprüngliche prototype
Eigenschaft der Konstruktorfunktion:
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 ); // {}
Deshalb ist es besser, wenn Sie die neue Object.getPrototypeOf
Methode, die in ES5 eingeführt wurde.
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' }
Eine andere Lösung wäre gewesen, sicherzustellen, dass Sie die constructor
Referenz auf den Prototyp:
function Foo() {}
// Overwriting the initial prototype
Foo.prototype = {
constructor: Foo, // restore the constructor reference
foo: "bar"
};