Změna „prototype“
V následujícím kódu vytvoříme new Králík a pak se pokusíme změnit jeho prototyp.
Na začátku máme tento kód:
function Králík() {}
Králík.prototype = {
žere: true
};
let králík = new Králík();
alert( králík.žere ); // true
-
Přidáme další řádek (zvýrazněný). Co nyní zobrazí
alert?function Králík() {} Králík.prototype = { žere: true }; let králík = new Králík(); Králík.prototype = {}; alert( králík.žere ); // ? -
…A když kód vypadá takto (jeden řádek změněn)?
function Králík() {} Králík.prototype = { žere: true }; let králík = new Králík(); Králík.prototype.žere = false; alert( králík.žere ); // ? -
A takto (jeden řádek změněn)?
function Králík() {} Králík.prototype = { žere: true }; let králík = new Králík(); delete králík.žere; alert( králík.žere ); // ? -
Poslední varianta:
function Králík() {} Králík.prototype = { žere: true }; let králík = new Králík(); delete Králík.prototype.žere; alert( králík.žere ); // ?
Odpovědi:
-
true.Přiřazení do
Králík.prototypenastaví[[Prototype]]pro nové objekty, ale neovlivní již existující. -
false.Objekty jsou přiřazovány odkazem. Objekt z
Králík.prototypenení duplikován, ale je to stále jediný objekt, na který se odkazují jakKrálík.prototype, tak[[Prototype]]objektukrálík.Když tedy změníme jeho obsah skrz jeden odkaz, uvidíme to i druhým odkazem.
-
true.Všechny operace
deletese aplikují přímo na objekt. Zde sedelete králík.žerepokusí odstranit vlastnostžerez objektukrálík, ale ten ji neobsahuje. Operace tedy nemá žádný účinek. -
undefined.Vlastnost
žereje smazána z prototypu a nadále neexistuje.