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á
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 porRabbit.prototype
como 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
delete
se aplican directamente al objeto. Aquídelete rabbit.eats
intenta eliminar la propiedadeats
derabbit
, pero no la tiene. Entonces la operación no tendrá ningún efecto. -
undefined
.La propiedad
eats
se elimina del prototipo, ya no existe.