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:
-
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 -
Sınıf tabanlı kalıtım (ES6 ve sonrası):
classve `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.