JavaScript'te prototip miras nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
JavaScript'te nesneler, prototiplerinden özellikler ve metodlar miras alır. Her nesnenin prototipi, prototip zinciri aracılığıyla erişilebilen başka bir nesnedir.
Bir nesnenin özelliğine erişirken, JavaScript önce doğrudan nesnede arar. Özellik bulunamazsa, arama bu nesnenin prototipinde, sonra prototipin prototipinde ve böyle devam eder, ta ki özellik bulunana veya zincirin sonuna (null) ulaşana kadar.
Prototip mirasçılığı, nesnelerin yapılarını ve davranışlarını tanımlayan sınıflardan oluşturulan nesnelerin kullanıldığı klasik mirasçılıktan farklıdır. JavaScript'te, ES6 ile tanıtılan sınıflar, prototip tabanlı miras üzerinde bir sözdizimi şekeridir.
Ana noktalar:
- __proto__: Nesnenin içsel özelliği, prototipe işaret eder.
- prototype: Yapıcı fonksiyonun (kullanılan fonksiyon) özelliği, oluşturulan örnekler için prototip olarak hizmet edecek nesneye işaret eder.
- Object.getPrototypeOf(obj): Bir nesnenin prototipini almak için standart yöntem.
- Object.setPrototypeOf(obj, proto): Bir nesnenin prototipini ayarlamak için standart yöntem.
Örnek:
// Yapıcı fonksiyon
function Animal(name) {
this.name = name;
}
// Prototype'a metod ekle
Animal.prototype.sayHello = function() {
console.log(`Merhaba, benim adım ${this.name}`);
};
// Bir örnek oluştur
const dog = new Animal("Buddy");
// Prototype metodunu çağır
dog.sayHello(); // Çıktı: Merhaba, benim adım Buddy
// dog'un prototipi Animal.prototype'dir
console.log(Object.getPrototypeOf(dog) === Animal.prototype); // true
// Animal.prototype'un prototipi Object.prototype'dir
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // true
// Prototip zincirinin sonu null'dur
console.log(Object.getPrototypeOf(Object.prototype) === null); // true
Klasik mirasçılıkla karşılaştırma (ES6 sınıflarını kullanarak):
class Animal {
constructor(name) {
this.name = name;
}
sayHello() {
console.log(`Merhaba, benim adım ${this.name}`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // Ebeveyn sınıfın yapıcı fonksiyonunu çağır
this.breed = breed;
}
bark() {
console.log("Hav hav!");
}
}
const buddy = new Dog("Buddy", "Golden Retriever");
buddy.sayHello(); // Çıktı: Merhaba, benim adım Buddy (Animal'dan kalıtılmış)
buddy.bark(); // Çıktı: Hav hav! (Dog'un metodu)
// ES6 sınıfları, prototipler üzerinde sözdizimi şekeridir
console.log(Object.getPrototypeOf(Dog) === Animal); // true (sınıf kalıtımı)
console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // true (metodların prototipler aracılığıyla kalıtımı)
console.log(Object.getPrototypeOf(buddy) === Dog.prototype); // true (örnek, sınıfın prototipinden kalıtım alır)
Prototip tabanlı miras, JavaScript'te temel bir kavramdır ve dil ile etkin çalışmak için anlaşılması önemlidir.