tipo objeto new mdn functions ejemplos dato create crear javascript prototype instantiation

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