tilbage til lektionen

Ændring af "prototype"

vigtighed: 5

I koden nedenfor opretter vi new Rabbit, og forsøger derefter at ændre dens prototype.

I starten har vi følgende kode:

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

let rabbit = new Rabbit();

alert( rabbit.eats ); // true
  1. Vi har tilføjet endnu en streng (fremhævet). Hvad viser alert nu?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype = {};
    
    alert( rabbit.eats ); // ?
  2. …Og hvis koden ser således ud (har erstattet en linje)?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype.eats = false;
    
    alert( rabbit.eats ); // ?
  3. Og, hvad med denne her (har erstattet en linje)?

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

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

Svarene er:

  1. true.

    Tildelingen til Rabbit.prototype sætter [[Prototype]] for nye objekter, men påvirker ikke eksisterende objekter. Så rabbit har stadig den gamle prototype, hvor eats er true.

  2. false.

    Objekter bliver tildelt med reference til det oprindelige objekt. Objektet fra Rabbit.prototype er ikke kopieret, det er stadig et enkelt objekt refereret både af Rabbit.prototype og af [[Prototype]]rabbit.

    Så når vi ændrer dets indhold via én reference, er det synligt via den anden reference.

  3. true.

    Alle delete operationer udføres direkte på objektet. Her forsøger delete rabbit.eats at fjerne eats egenskaben fra rabbit, men det har ikke den egenskab. Så operationen har ingen effekt.

  4. undefined.

    Egenskaben eats er slettet fra prototypen, den eksisterer ikke længere.