GeezerVison is showing es.javascript.info — Cambiando "prototype"
regresar a la lecciónCambiando "prototype"
importancia: 5
En el siguiente código creamos new Rabbit, y luego intentamos modificar su prototipo.
Al principio, tenemos este código:
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
alert( rabbit.eats ); // verdadero
-
Agregamos una cadena más (enfatizada). ¿Qué mostrará alert ahora?
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
Rabbit.prototype = {};
alert( rabbit.eats ); // ?
-
…¿Y si el código es así (se reemplazó una línea)?
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
Rabbit.prototype.eats = false;
alert( rabbit.eats ); // ?
-
¿Y así (se reemplazó una línea)?
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
delete rabbit.eats;
alert( rabbit.eats ); // ?
-
La última variante:
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
delete Rabbit.prototype.eats;
alert( rabbit.eats ); // ?
Respuestas:
-
verdadero.
La asignación a Rabbit.prototype configura [[Prototype]] para objetos nuevos, pero no afecta a los existentes.
-
falso.
Los objetos se asignan por referencia. El objeto de Rabbit.prototype no está duplicado, sigue siendo un solo objeto referenciado tanto por Rabbit.prototype como por el [[Prototype]] de rabbit.
Entonces, cuando cambiamos su contenido a través de una referencia, es visible a través de la otra.
-
verdadero.
Todas las operaciones delete se aplican directamente al objeto. Aquí delete rabbit.eats intenta eliminar la propiedad eats de rabbit, pero no la tiene. Entonces la operación no tendrá ningún efecto.
-
undefined.
La propiedad eats se elimina del prototipo, ya no existe.