regresar a la lección

Cambiando "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
  1. 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 ); // ?
  2. …¿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 ); // ?
  3. ¿Y así (se reemplazó una línea)?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    delete rabbit.eats;
    
    alert( rabbit.eats ); // ?
  4. La última variante:

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    delete Rabbit.prototype.eats;
    
    alert( rabbit.eats ); // ?

Respuestas:

  1. verdadero.

    La asignación a Rabbit.prototype configura [[Prototype]] para objetos nuevos, pero no afecta a los existentes.

  2. 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.

  3. 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.

  4. undefined.

    La propiedad eats se elimina del prototipo, ya no existe.