Javascript 9 | Prototype Özelliği

Ömer Çelik
2 min readJan 2, 2020

--

Javascript’in , C#, Java ve Phyton gibi dillerden farkı class tabanlı bir dil olmamasıdır. Javascript, prototype tabanlı bir dildir.

Javascript’ in en temel constructor’ı object’tir.
Mesela bir person function’imiz var. Bunun field’lari name ve surname diyelim. Ayrıca bu function içerisinde adı ve soyadı return eden bir method’umuz(showInfos) var diyelim.
Bu person’dan 3 tane nesne ürettiğimizi varsayalım. field’larimiz ve method‘larımızdan 3 tane kopya oluşturmuş oluruz. Unique’liği sağlayan kısım field’lar olduğu için bunları kopyalamak doğal bir şey, ancak method’ları kopyalamamız boşu boşuna hafıza da yer kaplamamıza sebep olur. Bu yüzden bu function’imiz içerisindeki prototype’a methodlarımızı koyarız ve 3 nesneden de buraya erişebiliriz.

Person functionın’dan türeyen tüm nesneler için tek bir method oluyor. Ve hepsi bu method’u kullanıyor. Çok doğru bir kelime olmasa da burayı static bir alan gibi düşünebiliriz. Ve çok önemlidir. Aslında prototype objeler arasında kalıtım yapabilmemizi sağlıyor.

Hatta person nesnemizi incelediğimizde içerisinde field’larimiz ve prototype bulunuyor. prototype içerisinde person constructor’i , koyduğumuz functionlar , ve object prototype’ı bulunuyor.
Object prototype’nın bulunma sebebi tüm nesneler object’den türediği için onun tüm functionlarını miras aldık.

Genel olarak oluşturmamız gereken yapı yukarıdaki resim gibi olmalıdır.

Javascript de prototype özelliğini inheritance için kullanırız. Ancak genel olarak bir bilgi verelim.
Bütün yarattığımız objeler, object prototype’ından türemektedirler. Ayrıca prototype içerisindeki bir field atadığımızı varsayalım. Bu field’ın primitive ve reference type olmasına göre davranışlar değişir.

Eğer bu field primitive bir veri tipiyse ;
Diyelim ki A sınıfından 3 tane yeni reference yarattık. Ve herhangi birinde A sınıfının a field’ını değiştirdik. Diğer 2 reference da bu field değeri değişmez.
Ancak bu değerimiz reference type olsaydı;

2 tane yarattığımız reference da da bu değer değişirdi. Çünkü reference direk adresini tutuyoruz.

Reference Type

Bu sorunu çözebilmek için çözümümüz nasıl olmalıdır?
Öncelikli olarak problemlerimiz ;

Constructor içerisine method koyduğumuz da her yaratılan yeni obje için gereksiz yere memory’de fazladan function yaratılıyor. Birincisi bunun önüne geçmemiz gerekiyor.
2. si prototype ile çalışırken bir objenin property’si üzerinde değişiklik
yaptığımızda bu diğerlerine de yansıyor.
Bu sorunların 2 sinide constructor’da field’ları , prototype’da
methodları tutarak çözeriz.

Bu örneğimiz ile görmüş olduk. Methodlarımızı olabildiğince prototype’lar içerisine gömmeliyiz. Unique’liği sağlayan field’larımız ise constructor içerisidne bulunmalıdır.

Makalelerimin tamamına erişmek isteyen arkadaşlar için hepsinin linkinin bulunduğu bir tutorial hazırladım. Aşağıdaki linkte paylaşıyorum.

https://medium.com/@omercelikceng/javascript-makalelerimin-tamam%C4%B1-45a71ac3b386

--

--