Cambiando "prototype"
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á
alertahora?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.prototypeconfigura[[Prototype]]para objetos nuevos, pero no afecta a los existentes. -
falso.Los objetos se asignan por referencia. El objeto de
Rabbit.prototypeno está duplicado, sigue siendo un solo objeto referenciado tanto porRabbit.prototypecomo por el[[Prototype]]derabbit.Entonces, cuando cambiamos su contenido a través de una referencia, es visible a través de la otra.
-
verdadero.Todas las operaciones
deletese aplican directamente al objeto. Aquídelete rabbit.eatsintenta eliminar la propiedadeatsderabbit, pero no la tiene. Entonces la operación no tendrá ningún efecto. -
undefined.La propiedad
eatsse elimina del prototipo, ya no existe.