Ændring af "prototype"
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
-
Vi har tilføjet endnu en streng (fremhævet). Hvad viser
alertnu?function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); Rabbit.prototype = {}; alert( rabbit.eats ); // ? -
…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 ); // ? -
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 ); // ? -
Sidste variant?
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); delete Rabbit.prototype.eats; alert( rabbit.eats ); // ?
Svarene er:
-
true.Tildelingen til
Rabbit.prototypesætter[[Prototype]]for nye objekter, men påvirker ikke eksisterende objekter. Sårabbithar stadig den gamle prototype, hvoreatsertrue. -
false.Objekter bliver tildelt med reference til det oprindelige objekt. Objektet fra
Rabbit.prototypeer ikke kopieret, det er stadig et enkelt objekt refereret både afRabbit.prototypeog af[[Prototype]]pårabbit.Så når vi ændrer dets indhold via én reference, er det synligt via den anden reference.
-
true.Alle
deleteoperationer udføres direkte på objektet. Her forsøgerdelete rabbit.eatsat fjerneeatsegenskaben frarabbit, men det har ikke den egenskab. Så operationen har ingen effekt. -
undefined.Egenskaben
eatser slettet fra prototypen, den eksisterer ikke længere.