JavaScript’te “class” Anahtar Kelimesinin Kullanımı
JavaScript’te class anahtar kelimesi, ECMAScript 2015 (ES6) ile tanıtılan ve kendi özelliklerine ve yöntemlerine sahip yeni bir nesne türü tanımlamak için kullanılan nispeten yeni bir özelliktir.
JavaScript’te “class” Anahtar Kelimesi
JavaScript, özellikle diğer programlama dillerinde sınıf tabanlı deneyimi olan geliştiriciler için tanıdık bir yapı sağlamak amacıyla ECMAScript 6 (ES6) ile birlikte sınıf tabanlı programlama özellikleri sunmaya başlamıştır.
Belirtmek isterim ki bu yapı, JavaScript’in altında yatan prototip tabanlı miras modelini değiştirmez. Bir nevi, dildeki mevcut prototip tabanlı miras modelini anlaşılır kılmak adına ortaya çıkmış söz dizimsel şekerlerden (Syntactic sugar) biridir.
Yani JavaScript’teki “class” anahtar kelimesi, JavaScript’in prototip tabanlı yapısına bir alternatif olması için değil bu yapıyı daha okunabilir ve anlaşılır kılan bir söz dizimi sunmak için dile kazandırılmıştır.
Aşağıdaki örneği inceleyelim ve bunu “class” anahtar kelimesi kullanarak nasıl diğer dillerdekine benzer bir hüviyete kavuşturacağımızı gösterelim:
1 2 3 4 5 6 7 8 9 10 11 |
function Kisi(ad, soyad) { this.ad = ad; this.soyad = soyad; } Kisi.prototype.tamAd = function() { return this.ad + ' ' + this.soyad; }; var kisi1 = new Kisi('Ali', 'Veli'); console.log(kisi1.tamAd()); // Ali Veli |
Bu yapıda, Kisi
isimli bir fonksiyon oluşturduk ve bu fonksiyonu bir constructor olarak kullandık. Yani new
anahtar kelimesi ile bu fonksiyondan yeni bir nesne örnekleyebiliyoruz. Bu nesnenin metodları ise prototype
aracılığıyla eklenir. Bu, JavaScript’te uzun yıllar boyunca nesne yönelimli programlama yapısını uygulamak için kullanılan yöntemdir. Ancak ES6 ile gelen class
yapısı, bu işlemleri daha anlaşılır, düzenli ve tanıdık bir şekilde yapabilmemizi sağlamıştır.
1 2 3 4 5 6 7 8 9 10 |
class Kisi { constructor(ad, soyad) { this.ad = ad; this.soyad = soyad; } tamAd() { return `${this.ad} ${this.soyad}`; } } |
Bu yapıyla tanıştıktan sonra, bu kod parçasının aslında JavaScript’in altında yatan prototip tabanlı miras modelini değiştirmediğini umarım fark etmişsinizdir. Söz konusu class yapısı, dildeki mevcut prototip tabanlı miras modelini daha anlaşılır kılmak adına eklenen “syntactic sugar” olarak kabul edilmelidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Rectangle { constructor(height, width) { this.height = height; this.width = width; } area() { return this.height * this.width; } } let rect = new Rectangle(10, 5); console.log(rect.area()); //50 |
Bu yapıda Rectangle
adında bir fonksiyon tanımlıyoruz ve bu fonksiyonu bir constructor (yapıcı) olarak kullanıyoruz. Bu fonksiyondan türettiğimiz nesnelerin ortak metodları olan area
fonksiyonunu ise Rectangle
fonksiyonunun prototype
‘ına ekliyoruz. Bu sayede tüm Rectangle
nesneleri bu metodu kullanabilir hale geliyor. Nihayetinde new anahtar kelimesi kullanılarak Rectangle
‘ın yeni bir örneği oluşturulduğunda, constructor
metodu otomatik olarak belirtilen argümanlarla çağrılır ve yeni objeyi başlatır.
“extends” ile Miras
JavaScript’teki “class” anahtar kelimesi, extends
anahtar kelimesi aracılığıyla mirası da sağlar. Böylece bir üst sınıftan miras alan ve kendi özelliklerine ve metotlarına sahip olabilen bir alt sınıfı tanımlayabiliriz. Örneğin:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Rectangle { constructor(height, width) { this.height = height; this.width = width; } area() { return this.height * this.width; } } class Square extends Rectangle { constructor(sideLength) { super(sideLength, sideLength); } } let sq = new Square(5); console.log(sq.area()); // 25 |
Yukarıdaki örneğimizde ise, Square
sınıfımız Rectangle
‘ın alt sınıfıdır ve constructor
ve alan
metotlarını miras alır. Square
‘ın constructor
‘ında Rectangle
‘ın constructor
‘ını çağırmak için super anahtar kelimesi kullanmıştır.
Genel olarak, JavaScript’teki “class” anahtar kelimesi, nesne yönelimli programlama için daha temiz ve daha sezgisel bir söz dizimi sağlar, ancak bunun hala prototipler ve prototip tabanlı miras üzerine inşa edildiğini unutmamalıyız.