Sobes.tech
Junior

JavaScript'te kalıtımın nasıl çalıştığını açıklayın.

sobes.tech yapay zeka

AI'dan gelen yanıt

JavaScript'te kalıtım, prototipler aracılığıyla gerçekleştirilir. JavaScript'teki her nesne, başka bir nesneye referans veren içsel [[Prototype]] özelliğine sahiptir. Bir nesnenin doğrudan üzerinde olmayan bir özellik veya yönteme erişmeye çalıştığımızda, JavaScript motoru bu özelliği veya yöntemi nesnenin prototipinde arar. Eğer bulamazsa, [[Prototype]] bağlantılarıyla oluşan prototip zinciri boyunca aramaya devam eder ve null'a (zincirin sonu) ulaşana kadar devam eder.

İki ana kalıtım mekanizması vardır:

  1. Klasik prototip kalıtımı (ES5 ve öncesi): Fonksiyon yapıcılar ve onların prototype özelliklerinin kullanılmasıyla temel alınmıştır.

    // Yapıcı fonksiyon
    function Animal(name) {
      this.name = name;
    }
    
    // Prototype'a metod ekle
    Animal.prototype.speak = function() {
      console.log(`${this.name} ses çıkarıyor.`);
    };
    
    // Bir örnek oluştur
    const dog = new Animal('Köpek');
    
    // Prototype'tan metodu çağır
    dog.speak(); // Çıktı: Köpek ses çıkarıyor.
    
    // cat'in prototype'ı Animal.prototype'dır
    console.log(Object.getPrototypeOf(dog) === Animal.prototype); // true
    
  2. Sınıf tabanlı kalıtım (ES6 ve sonrası): class ve `extends sözdizimi kullanır, ki bu da yine prototiplerle çalışır.

    // Temel sınıf
    class Animal {
      constructor(name) {
        this.name = name;
      }
    
      speak() {
        console.log(`${this.name} ses çıkarıyor.`);
      }
    }
    
    // Animal'den türeyen alt sınıf
    class Dog extends Animal {
      constructor(name, breeds) {
        super(name); // Ana sınıfın yapıcı metodunu çağır
        this.breeds = breeds;
      }
    
      bark() {
        console.log(`${this.name} havlıyor.`);
      }
    }
    
    // Alt sınıf örneği oluştur
    const myDog = new Dog('Bublik', ['Labrador', 'Collie']);
    
    // Animal ve Dog metodlarını çağır
    myDog.speak(); // Çıktı: Bublik ses çıkarıyor.
    myDog.bark();  // Çıktı: Bublik havlıyor.
    
    // myDog'un prototipi Dog.prototype'dir
    console.log(Object.getPrototypeOf(myDog) === Dog.prototype); // true
    
    // Dog.prototype'un prototipi Animal.prototype'dir
    console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // true
    

Ana kavramlar:

  • Prototip zinciri: Nesneler arasındaki [[Prototype]] bağlantısı.

  • __proto__ (kullanım önerilmez, standart değil, ama kavramayı kolaylaştırır): [[Prototype]]'a erişmek için kullanılabilir. Üretimde kullanılması önerilmez.

  • Object.getPrototypeOf(obj) : Bir nesnenin prototipini almak için standart yöntem.

  • Object.setPrototypeOf(obj, proto) : Bir nesnenin prototipini değiştirmek için standart yöntem (mevcut nesnelerin prototipini değiştirmek için önerilmez).

  • instanceof : Bir nesnenin belirli bir sınıf veya yapıcı fonksiyonun örneği olup olmadığını, prototip zinciri aracılığıyla kontrol eder.

    console.log(myDog instanceof Dog);   // true
    console.log(myDog instanceof Animal); // true
    console.log(myDog instanceof Object); // true (zincirin sonunda Object.prototype)
    
  • super : Sınıflarda, ebeveyn sınıfın metodlarını veya yapıcı fonksiyonunu çağırmak için kullanılır.

Klasik ve sınıf tabanlı yaklaşımlar arasındaki fark: Sınıflar, prototip kalıtımıyla çalışmayı daha yapılandırılmış ve sözdizimi açısından daha kullanışlı hale getirir, diğer programlama dillerine yakın bir yapı sağlar. Ancak temel mekanizma aynıdır — prototipler aracılığıyla kalıtım.