HAZIRLAYAN: ALAA KHALAF/2170390
Sınıflar başka sınıfları genişletebilirler. Bunun için prototip kalıtımı tabanlı güzel bir yazılışı bulunmaktadır.
Diğer bir sınıftan kalıtım sağlamak için "extends" ile belirtmek gerekmektedir.
Aşağıda Animal'dan kalıtım alan Rabbit sınıfı gösterilmektedir:
extends kelimesi aslında Rabbit.prototype'dan referans alıp bunun [[Prototype]]'ını Animal.prototype'a ekler. Aynen daha önce de gördüğümüz gibi.
Artık rabbit hem kendi metodlarına hem de Animal metodlarına erişebilir.
extends'ten sonra her türlü ifade kullanılabilir.
Extends'ten sonra sadece sınıf değil her türlü ifade kullanılabilir.
Örneğin, üst sınıfı yaratan yeni bir fonksiyon çağrısı:
Burada class User f("Hello")'nun sonucunu kalıtır.
Bu belki çok ileri teknik programlama kalıpları için kullanışlı olabilir. Böylece birçok koşula göre fonksiyonları kullanarak farklı sınıflar oluşturabilir ve bunlardan kalıtım alınabilir.
Şimdi biraz daha ileri gidelim ve metodun üstüne yazalım. Şimdiden sonra Rabbit stop metodunu kalıtım alır, bu metod this.speed=0'ı Animal sınıfında ayarlamaya yarar.
Eğer Rabbit içerisinde kendi stop metodunuzu yazarsanız buna üstüne yazma denir ve Animal'da yazılmış stop metodu kullanılmaz.
…Fakat genelde üst metodun üzerine yazmak istenmez, bunun yerine küçük değişiklikler yapmak veya fonksiyonliteyi genişletmek daha fazla tercih edilen yöntemdir. Metodda birçeyler yapar ve genelde bundan önce/sonra veya işlerken üst metodu çağırırız.
Sınıflar bunun için "super" anahtar kelimesini sağlarlar.
super.method(...) üst class’ın metodunu çağırmak için.
super(...) üst metodun yapıcısını (constructor) çağırmak için kullanılır.
Örneğin, Rabbit otomatik olarak durduğunda gizlensin.
Artık Rabbit, stop metodunda üst sınıfın super.stop()'unu çağırmaktadır.
Ok fonksiyonu içerisindeki super ile stop() içerisine yazılan super aynıdır. Eğer “sıradan” bir fonksiyon tanımlarsak bu hataya neden olabilir:
Yapıcı metodlar ile yapılan şeyler biraz çetrefillidir.
Şimdiye kadar Rabbit kendisine ait yapıcı'ya sahipti.
Şartname’ye göre eğer bir sınıf diğer başka bir sınıftan türer ve constructor'a sahip değil ise aşağıdaki yapıcı otomatik olarak oluşturulur.
Gördüğünüz gibi aslında üst sınıfın yapıcı'sını tüm argümanları göndererek çağırır. Eğer kendimiz bir yapıcı yazmazsak bu meydana gelir.
Özel olarak uyarlanmış bir yapıcı oluşturalım. Bu isim ile birlikte earLength'i de tanımlasın:
Nasıl ya! Hata aldık. Şimdi de rabbit oluşturamıyoruz. Neden peki?
Kısa cevap: Türemiş sınıftaki yapıcı kesinlikle super(...) i çağırmalıdır. Bu this'den önce olmalıdır.
…Peki neden? Çok garip değilmi?
Tabi bu açıklanabilir bir olay. Detayına girdikçe daha iyi anlayacaksınız.
JavaScript’te “türeyen sınıfın yapıcı fonksiyonu” ve diğerleri arasında farklılıklar mevcuttur. Türemiş sınıflarda eş yapcıı fonksiyonlar içsel olarak [[ConstructorKind]]:"derived" şeklinde etiketlenir.
Farklılık:
Normal yapıcı çalıştığında boş bir objeyi this olarak yaratır ve bunun ile devam eder.
Fakat türemiş sınıfın yapıcısı çalıştığında bunu yapmaz. Üst fonksiyonun yapıcısının bunu yapmasını bekler.
Eğer kendimiz bir yapıcı yazarsak bundan dolayı super i çağırmamız gerekmektedir. Aksi halde this referansı oluşturulmaz ve biz de hata alırız.
Rabbit'in çalışabilmesi için this'den önce super() çağırılmalıdır.
ES6 ile beraber class yapısı kullanılmaya başlanmıştır.