назад до уроку

Заміна властивості "prototype"

важливість: 5

В коді, що показаний нижче, ми створюємо об’єкт new Rabbit і потім міняємо його прототип.

На початку, маємо цей код:

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

let rabbit = new Rabbit();

alert( rabbit.eats ); // true
  1. Ми додали ще рядок коду (виділений). Що покаже тепер alert?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype = {};
    
    alert( rabbit.eats ); // ?
  2. …А якщо маємо такий код (з видаленим рядком коду)?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype.eats = false;
    
    alert( rabbit.eats ); // ?
  3. А якщо так (також з видаленим рядком коду)?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    delete rabbit.eats;
    
    alert( rabbit.eats ); // ?
  4. І останній варіант:

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

Відповідь:

  1. true.

    Визначення Rabbit.prototype встановлює властивість [[Prototype]] для новоствореного об’єкта, але це жодним чином не впливає на вже існуючий об’єкт.

  2. false.

    Об’єкти призначаються шляхом посилання на них. Об’єкт з властивістю Rabbit.prototype не дублюється, це є той самий об’єкт на який посилаються як через Rabbit.prototype так і через властивість [[Prototype]] об’єкта rabbit.

    А отже, коли ми змінюємо контент такого об’єкта через посилання, такі зміни стають видимі і через інші посилання.

  3. true.

    Усі delete операції застосовуються безпосередньо на самому об’єкті. Тут delete rabbit.eats намагається видалити властивість eats з об’єкта rabbit, але такої властивості немає. А тому така операція не має ніякого ефекту.

  4. undefined.

    Властивість eats видалена з прототипу, вона більше не існує.