

Javascript Inheritance Ile İlgili Bir Soru
-
Arkadaslar Merhabalar, Javascript'in inheritance mekanizmasi ile ilgili olarak bir kac sorum olacakti. Her objenin gizli olarak kendi prototype'ina bagli oldugunu biliyorum. Istenilen method veya elemanlarin bu prototype zinciri taranarak bulundugunu da biliyorum. Benim Javascript ile kafamin karistigi nokta surada:
Javascriptte aslinda constructorlar birer fonksiyon. Bu fonksiyonlar "new" sozcugu ile cagirildigi zaman birer obje yaratiyorlar. Bu fonksiyonlar istenirse kullanici tarafindan yaziliyor istenirse built-in fonksiyonlar kullaniliyor. Javascript'te bulunan Object(), Array() ve Date() gibi builtin objeler kendi methodlarina sahipler.
Eger console'da typeof(Object) veya benzeri birsey yaptiysaniz gelen cevabin function oldugunu goreceksiniz. Eger typeof(Object()) yazilirsa bu sefer gelen cevap object seklinde oluyor. Buraya kadar zaten problem yok. Demek ki Object'in kendisi de bir constructor fonksiyon.
Peki Object yazip yanina nokta koydugumda onume bir cok secenek geliyor. Bunlar arasinda prototype objesinin kendisi, Object.prototype icerisinde tanimli olmayan ama sadece Object icerisinde tanimli olan bircok fonksiyon, birde gizli ozellikler var, mesela getPrototypeOf veya isProtoTypeOf gibi. Bunlar Object.prototype objesine bagli degiller. Burdan gordugum kadariyla aslinda constructor fonksiyonlar kendisi de aslinda birer obje. Object constructor fonksiyonu kendisi prototype diye ayri bir obje tutuyor ve bu objenin elemanlari Javascript'te olusturulan diger objeler tarafindan inherit ediliyor fakat sadece Object'in kendisi (dikkat edin new Object() degil) hic bir obje tarafindan inherit edilmiyor.
Buna bir aciklamaniz varsa cok yardimci olursunuz.
Tesekkurler,
-
Javascript değil java olmasın?
-
Yok hocam Javascript. Javasrcriptteki inheritance mekanizmasi class based dillerden farkli bayagi.
-
Abi sorun biraz karmaşık geldi, yanlış anlamış olabilirim. Eğer problemi doğru anladıysam aşağıda yazdıklarım anlamana yardımcı olur diye düşünüyorum.
Şimdi object ve constructor farkını doğru anladığından emin misin? Sanki bu ikisini birbirine karıştırıyormuşsun gibi geldi bana. Javascript'te C# veya Java gibi class yazıp ondan object oluşturma gibi bir yapı yok. Javascript'te direk Object() constructor methodunu çağırarak nesne oluşturuyorsun. Yani "Object()" bir obje değil, bir objenin constructor methodu (yani typeof(Object) çağrısının sonucunun fonksiyon olması normal).
Javascript'teki tüm nesnelerin inherite edildiği nesne olan Object nesnesi, Object() constructor'ına, prototype nesnesine ve getPrototypeOf() gibi fonksiyonlara sahip.
-
mfe25 bunu yazdı
Abi sorun biraz karmaşık geldi, yanlış anlamış olabilirim. Eğer problemi doğru anladıysam aşağıda yazdıklarım anlamana yardımcı olur diye düşünüyorum.
Şimdi object ve constructor farkını doğru anladığından emin misin? Sanki bu ikisini birbirine karıştırıyormuşsun gibi geldi bana. Javascript'te C# veya Java gibi class yazıp ondan object oluşturma gibi bir yapı yok. Javascript'te direk Object() constructor methodunu çağırarak nesne oluşturuyorsun. Yani "Object()" bir obje değil, bir objenin constructor methodu (yani typeof(Object) çağrısının sonucunun fonksiyon olması normal).
Javascript'teki tüm nesnelerin inherite edildiği nesne olan Object nesnesi, Object() constructor'ına, prototype nesnesine ve getPrototypeOf() gibi fonksiyonlara sahip.
Doğru anlamışsın. Aradığı cevap bold olan yer.
-
Ornekler ustunden gidelim.
function deneme (isim, soyisim,yas){
this.isim = isim;
this.soyisim = soyisim;
this.yas = yas;
}
Constructor fonksiyon diye belirttigim sey buydu. Sonucta bir fonksiyon tanimi. Bunu mesela ,
var obj = new deneme(); seklinde cagirirsak obj degiskeni olusturulan yeni bir objeye baglaniyor.
Bu arada deneme adli fonksiyon parantezlerle cagirmadan yanina kendi icersindeki methodlara yada propertylere baktigimizda prototype'i goruyoruz. new deneme() yazarak yarattigimiz obj objesi
deneme.prototype'in ozelliklerini inherit ediyor, direkt olarak deneme'nin kendisinin degil. Sanirim ayni sey Object.prototype'ta da var. Yani yeni uretilen objeler inherit edecegi seyleri Object'ten degil
Object.prototype'tan inherit ediyorlar. Normalde var x = new Object() diye birsey yaptigimizda x' e ait herhangi bir prototype gozukmuyor console'da. Fakat eger sadece Object'in elemanlarini incelersek icerisinde bircok tanimli fonksiyon bir de Object.prototype'i goruyoruz. O zaman yeni uretilen objeler aslinda ozelliklerini Object'in kendisinden inherit etmemis oluyorlar, onun yerine Object.prototype'in methodlarini veya ozelliklerini inherit ediyorlar benim anladigim kadariyla. deneme orneginden yola cikarak diyorum ki o zaman Object in kendisi de yukaridaki gibi bir fonksiyon. Javascript run-time environment anladigim kadariyla yukaridaki gibi her constructor fonksiyona birde prototype objesi bagliyor?
Dogru muyum?