JavaScript'te nesne yönelimli programlama ile diğer programlama dillerindeki OOP arasındaki fark nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
JavaScript, prototip tabanlı kalıtımı sınıf tabanlı yerine kullanır.
Sınıf tabanlı dillerde, nesneler yapılarını ve davranışlarını tanımlayan sınıfların örnekleridir. Kalıtım, mevcut sınıfların genişletilmesiyle gerçekleştirilir.
JavaScript'te geleneksel anlamda sınıflar yoktur. Nesneler doğrudan veya diğer prototip nesneler temel alınarak oluşturulur. Kalıtım, her nesnenin "ebeveyn" prototipine bağlantısı olan bir prototip zinciri aracılığıyla uygulanır. Bir nesnenin özelliğine veya metoduna erişildiğinde, JavaScript önce nesnede, sonra prototipte, sonra prototipin prototipinde arama yapar ve zincir boyunca devam eder.
JavaScript'te nesne oluşturma ve kalıtım örneği:
// Prototip nesne oluşturma
const animal = {
speak() {
console.log('Genel bir ses');
}
};
// Prototip temel alınarak nesne oluşturma
const dog = Object.create(animal);
// Yeni nesne için metodu yeniden tanımlama
dog.speak = function() {
console.log('Hav!');
};
dog.speak(); // "Hav!" yazdırır
Sınıf tabanlı ve prototip tabanlı OOP karşılaştırması:
| Özellik | Sınıf tabanlı OOP (Java, C++) | Prototip tabanlı OOP (JavaScript) |
|---|---|---|
| Temel mekanizma | Sınıflar ve sınıf örnekleri | Nesneler ve prototipler |
| Kalıtım | 'extends' ile sınıf kalıtımı | Prototip zinciri aracılığıyla kalıtım |
| Nesne oluşturma | 'new' anahtar kelimesi ve yapıcı fonksiyonlar | Doğrudan, Object.create(), yapıcılar (fonksiyonlar) |
| Çok biçimlilik | Sınıflarda metodların yeniden tanımlanması | Nesnelerde özellik ve metodların yeniden tanımlanması |
| Kapsülleme | Erişim belirteçleri (public, private, protected) | Anlaşmalar ve kapanışlar (closures) |
ECMAScript 2015 (ES6) ile sınıfların eklenmesi, prototip kalıtım üzerine sözdizimi şekerleri sağlayarak JavaScript'teki OOP'yi sınıf tabanlı dillere daha çok benzetti, ancak temel mekanizma prototip kalmaya devam eder.
// ES6 sınıf kullanımı örneği
class Animal {
speak() {
console.log('Genel bir ses');
}
}
class Dog extends Animal {
speak() {
console.log('Hav!');
}
}
const myDog = new Dog();
myDog.speak(); // "Hav!" yazdırır