objeto - prototype javascript ejemplos
¿Por qué Object.create() y new Object() evalúan diferentes prototipos? (2)
¿Por qué estas 2 implementaciones se comportan de manera diferente? ¿Qué es exactamente lo que los diferencia cuando se trata de evaluar sus prototipos?
Creando un objeto con el prototipo especificado:
function Foo() {}
// creates an object with a specified prototype
var bar = Object.create(Foo);
console.log(Object.getPrototypeOf(bar)); // returns: function Foo(){}
console.log(Foo.isPrototypeOf(bar)); // returns: true
Creando un objeto con el método constructor:
function Foo() {}
// creates an object with the constructor method
var bar = new Foo();
console.log(Object.getPrototypeOf(bar)); // returns: Foo {}
console.log(Foo.isPrototypeOf(bar)); // returns: false
Además, ¿por qué la segunda implementación devuelve Foo {}
y false
?
Cuando usa la palabra clave ''nueva'' para crear una instancia de un objeto, JavaScript en realidad agrega dos líneas de código a su objeto.
Si pretende crear un objeto con una instanciación pseudoclásica, cree su objeto de la siguiente manera:
var Foo = function() {
this.property = ''baz'';
};
Cuando se llama var bar = new Foo()
Javascript ejecuta Foo de la siguiente manera:
var Foo = function() {
// ADDED CODE: var this = Object.create(Foo.prototype);
this.property = ''baz'';
// ADDED CODE: return this;
El uso de Object.create crea una relación de delegación del objeto recién creado al objeto especificado, por lo que en su primera barra de casos está delegando sus búsquedas en Foo, pero en el segundo caso las búsquedas se delegan en Foo.prototype.
Usted puede encontrar this publicación de blog interesante. Entra en la instanciación pseudoclásica (usando la nueva palabra clave) en lugar de la creación de prototipos, que no usa la nueva palabra clave.
Object.create(Foo)
significa "crear un objeto con Foo
como el prototipo".
new Foo()
significa "Crear un objeto con Foo.prototype
como el prototipo y Foo
como el constructor".
Por lo tanto, Foo
es el prototipo de Bar
en el primer ejemplo y el constructor de Bar
en el segundo ejemplo.
Creo que la segunda parte de su pregunta es provocada por una salida de consola engañosa: Object.getPrototypeOf(bar)
realidad devuelve Foo.prototype
, no Foo
:
function Foo() {}
var bar = new Foo();
Object.getPrototypeOf(bar) === Foo
// -> false
Object.getPrototypeOf(bar) === Foo.prototype
// -> true