torna alle lezioni

Cambiare "prototype"

importanza: 5

Nel codice sotto, andiamo a creare new Rabbit, e successivamente proviamo a modificare il suo prototype.

Inizialmente, abbiamo questo codice:

function Rabbit() {}
Rabbit.prototype = {
  eats: true
};

let rabbit = new Rabbit();

alert( rabbit.eats ); // true
  1. Aggiungiamo una o più stringhe. Cosa mostrerà alert ora?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype = {};
    
    alert( rabbit.eats ); // ?
  2. …E se il codice è come il seguente (abbiamo rimpiazzato una sola riga)?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype.eats = false;
    
    alert( rabbit.eats ); // ?
  3. E in questo caso (abbiamo rimpiazzato solo una riga)?

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

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

Riposte:

  1. true.

    L’assegnazione a Rabbit.prototype imposta [[Prototype]] per i nuovi oggetti, ma non influenza gli oggetti già esistenti.

  2. false.

    Gli oggetti vengono assegnati per riferimento. L’oggetto in Rabbit.prototype non viene duplicato, è sempre un oggetto riferito sia da Rabbit.prototype che da [[Prototype]] di rabbit.

    Quindi quando cambiamo il suo contenuto tramite un riferimento, questo sarà visibile anche attraverso l’altro.

  3. true.

    Tutte le operazion di delete vengono applicate direttamente all’oggetto. Qui delete rabbit.eats prova a rimuovere la proprietà eats da rabbit, ma non esiste. Quindi l’operazione non avrà alcun effetto.

  4. undefined.

    La proprietà eats viene rimossa da prototype, non esiste più.