Derse geri dön

"prototype"'i değiştirme

önem: 5

Aşağıdaki kodda new Rabbitile yeni bir Rabbit oluşturulmuş sonra prototype’ı değiştirilmeye çalışılmıştır.

Başlangıçta aşağıdaki koda sahibiz:

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

let rabbit = new Rabbit();

alert( rabbit.eats ); // true
  1. Bir tane daha karakter dizisi ekledik, alert ne gösterir?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype = {};
    
    alert( rabbit.eats ); // ?
  2. …Eğer kod aşağıdaki gibi değiştirilirse ne olur ( bir satır değiştirildi )?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype.eats = false;
    
    alert( rabbit.eats ); // ?
  3. Ya böyle ? ( bir satır değiştirildi )

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

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

Cevaplar:

  1. true.

    Rabbit.prototype ataması [[Prototype]]'I ayarlasada bu yeni objelerde etki eder. Var olanlarda bir değişikliğe neden olmaz.

  2. false.

    Objeler referanslar ile atanır. Rabbit.prototype’tan alınan obje kopya değildir, hala hem Rabbit.prototype hem de rabbit’in [[Prototype]]'ı tarafından referans edilir.

    Bundan dolayı referans edilen herhangi bir yerden içeriik değişirse bu diğerini de etkiler.

  3. true.

    Tüm delete operasyonları objeye doğrudan etki eder. Mesela delete rabbit.eats rabbit’ten eats özelliğini silmeye çalışır fakat yapaz. Bundan dolayı bu operasyonun hiçbir etkisi olayacaktır.

  4. undefined.

    eats prototip’ten silindiğinden dolayı artık bir etkisi olmayacaktır.