Eso es porque prototype
es una propiedad de la función constructora, no una propiedad de sí mismo. Sin embargo, el objeto prototype
tiene una referencia al constructor, para que pueda acceder de prototype
un objeto a través de su constructor
propiedad:
function Foo() {}
Foo.prototype.foo = "bar";
var c = new Foo;
console.log(c.constructor === Foo); // true
console.log(c.constructor.prototype); // { foo: 'bar' }
Sin embargo, esto no funcionará si sobrescribe el prototype
propiedad inicial de la función constructora:
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); // {}
Es por eso que es mejor utilizar el nuevo método Object.getPrototypeOf
introducido en 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' }
Otra solución habría sido para asegurarse de que restaura la referencia constructor
en el prototipo:
function Foo() {}
// Overwriting the initial prototype
Foo.prototype = {
constructor: Foo, // restore the constructor reference
foo: "bar"
};
Excelente explicación –
@TahaAhmad: ¡Me alegro de que haya ayudado! –