zpět k lekci

Změna „prototype“

důležitost: 5

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
  1. 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 ); // ?
  2. …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 ); // ?
  3. 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 ); // ?
  4. 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:

  1. true.

    Přiřazení do Králík.prototype nastaví [[Prototype]] pro nové objekty, ale neovlivní již existující.

  2. false.

    Objekty jsou přiřazovány odkazem. Objekt z Králík.prototype není duplikován, ale je to stále jediný objekt, na který se odkazují jak Králík.prototype, tak [[Prototype]] objektu králík.

    Když tedy změníme jeho obsah skrz jeden odkaz, uvidíme to i druhým odkazem.

  3. true.

    Všechny operace delete se aplikují přímo na objekt. Zde se delete králík.žere pokusí odstranit vlastnost žere z objektu králík, ale ten ji neobsahuje. Operace tedy nemá žádný účinek.

  4. undefined.

    Vlastnost žere je smazána z prototypu a nadále neexistuje.