JavaScript Kalıtım Almak

JavaScript ile OOP veya Nesne Yönelimli Programlama ile geliştirme sırasında kalıtım almak için kullanılan yöntemler yer alıyor.

İki ayrı nesnenin özellik ve metotlarını bir nesneye toplama işlemine kalıtım almak veya miras alma olarak geçmektedir.

JavaScript kalıtım alma diğer kalıtım alma desteği sunan yazılım dillerinden farklıdır.

JavaScript ile kalıtım almak için kullanılan çeşitli yöntemler vardır.

Constructor stealing – Kurucu çağırma

Bu yöntemde kalıtım alacak nesne, kalıtım alınacak nesnenin kurucusunu call veya apply metodunu kullanarak çağırır.

<script>
"use strict";
  function Hayvan() {
    this.renk = ["siyah", "beyaz"];
  }
  function Kedi() {
    Hayvan.call(this);     // Constructor stealing - Yapıcı çalma
    //Hayvan.apply(this);  // Constructor stealing 
  }

  var vKedi = new Kedi();
  vKedi.renk.push("sarı");
  console.log(vKedi.renk);  // siyah, beyaz, sarı

  var wKedi = new Kedi();
  console.log(wKedi.renk);  // siyah, beyaz
</script>

Kedi nesnesi renk isminde değişkene sahip olmadığı halde Hayvan nesnesinden kalıtım alarak Kedi nesnesinde kullandık.

Parametre göndermek

Kalıtım alınan nesnenin kurucusuna parametre göndermek isteyebiliriz.

<script>
"use strict";
  function Hayvan(a) {
    this.ad = a;
  }
  function Kedi() {
    Hayvan.call(this, "Tekir");       // Constructor stealing - Yapıcı çalma
    //Hayvan.apply(this, ["Tekir"]);  // Constructor stealing - Yapıcı çalma

    this.renk = "Sarı";
  }

  var vKedi = new Kedi();
  console.log(vKedi.ad);    // Tekir
  console.log(vKedi.renk);  // Sarı
</script>

veya

<script>
"use strict";
  function Hayvan(a) {
    this.ad = a;
  }
  function Kedi(adi) {
    Hayvan.call(this, adi);       // Constructor stealing - Yapıcı çalma
    //Hayvan.apply(this, [adi]);  // Constructor stealing - Yapıcı çalma

    this.renk = "Sarı";
  }

  var vKedi = new Kedi("Boncuk");
  console.log(vKedi.ad);    // Boncuk
  console.log(vKedi.renk);  // Sarı
</script>

Bu yöntem ile nesne kurucusu içindeki özellik ve metotlar kalıtım alınır.

<script>
"use strict";
  function Hayvan(a) {
    this.ad = a;
  }
  Hayvan.prototype.adiNe = function() {
    return this.ad;
  }
  function Kedi(adi) {
    Hayvan.call(this, adi);       // Constructor stealing - Yapıcı çalma
    //Hayvan.apply(this, [adi]);  // Constructor stealing - Yapıcı çalma

    this.renk = "Sarı";
  }

  var vKedi = new Kedi("Boncuk");
  console.log(vKedi.ad);       // Boncuk
  console.log(vKedi.renk);     // Sarı
  console.log(vKedi.adiNe());  // ???
</script>

Ancak prototype ile eklenmiş özellik ve metotlar kalıtım alınmaz.

Prototype chaining – Prototip zinciri

Bir önceki yöntem ile sadece nesne kurucu içerisindeki özellik ve metotları kalıtım alınabiliyorduk.

Nesne kurucusu içerisine metot eklemek bellek verimliliği açısından pek tercih edilmez.

Nesneye ait metotlar genellikle nesnenin prototype özelliğine yazılır.

Nesneye ait metotların tanımlandığı prototype özelliğinden kalıtım almak için Prototype chaining yöntemi kullanılır.

<script>
"use strict";
  function Hayvan() {
    this.renk = ["Siyah", "Beyaz", "Sarı"];
  }
  Hayvan.prototype.rengiNe = function() {
    return this.renk;
  }
  function Kedi() {
    this.ad = "Boncuk";
  }

  Kedi.prototype = new Hayvan();  // Prototype chaining - Prototip zinciri

  var vKedi = new Kedi();
  console.log(vKedi.ad);          // Boncuk
  console.log(vKedi.rengiNe());   // Siyah, Beyaz, Sarı
</script>

Bu yöntem ile Nesne Yönelimli Programlamada sıkça kullanılan Method overriding yani metot ezme yapılabilir.

<script>
"use strict";
  function Hayvan() {
    this.renk = ["Siyah", "Beyaz", "Sarı"];
  }
  Hayvan.prototype.rengiNe = function() {
    return this.renk;
  }
  function Kedi() {
    this.ad = "Boncuk";
  }

  Kedi.prototype = new Hayvan();   // Prototype chaining - Prototip zinciri

  Kedi.prototype.rengiNe = function(rengim) {    // Method overriding
    return "Benim rengim " + this.renk[rengim];
  }
  var vKedi = new Kedi();
  console.log(vKedi.ad);           // Boncuk
  console.log(vKedi.rengiNe(2));   // Benim rengim Sarı
</script>

Bu yöntem kalıtım alınan nesnenin referans bilgisini tuttuğu için kalıtım alınan nesne içerisindeki değişiklikler tüm nesnelerde geçerli olur.

<script>
"use strict";
  function Hayvan() {
    this.renk = ["Siyah", "Beyaz", "Sarı"];
  }
  function Kedi() {
    this.ad = "Boncuk";
  }

  Kedi.prototype = new Hayvan();  // Prototype chaining - Prototip zinciri

  var vKedi = new Kedi();
  vKedi.renk.push("Kahverengi");
  console.log(vKedi.ad);
  console.log(vKedi.renk);        // Siyah, Beyaz, Sarı, Kahverengi

  var wKedi = new Kedi();
  console.log(wKedi.ad);
  console.log(wKedi.renk);        // Siyah, Beyaz, Sarı, Kahverengi
</script>

Yukardaki örnekte sadece vKedi isimli nesneye ait renk dizi değişkenine Kahverengi değerini eklemek istedik.

Ancak referans bilgisi tutulduğu için değişiklik tüm nesnelerde etkili oldu.

Combination inheritance – Kombinasyon kalıtım

Kurucu çalma ve prototip zincirine ait sorunları çözmek için her ikisinin birlikte kullanıldığı yöntem olan Combination inheritance yani ikisinin kombinasyonu kullanılır.

<script>
"use strict";
  function Hayvan() {
    this.renk = ["Siyah", "Beyaz", "Sarı"];
  }
  function Kedi() {
    Hayvan.call(this);       // Constructor stealing - Yapıcı çalma
    //Hayvan.apply(this);  // Constructor stealing - Yapıcı çalma
    this.ad = "Boncuk";
  }

  Kedi.prototype = new Hayvan();  // Prototype chaining - Prototip zinciri

  var vKedi = new Kedi();
  vKedi.renk.push("Kahverengi");
  console.log(vKedi.ad);
  console.log(vKedi.renk);        // Siyah, Beyaz, Sarı, Kahverengi

  var wKedi = new Kedi();
  console.log(wKedi.ad);
  console.log(wKedi.renk);        // Siyah, Beyaz, Sarı
</script>

Kurucu çalma ve prototip zinciri beraber kullanılarak her ikisinin sorunlu tarafları giderilmiştir.

JavaScript Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!