.. Ama fonskiyonların obje olduğu için içinde this kullabileceği kısmını anlamadım ....bir de şunu okudum arştıma yaparken az önce w3schools dan diyor ki constructor hakkında : "In a constructor function this does not have a value. It is a substitute for the new object. The value of this will become the new object when a new object is created."
Hocam sorduğunuz soruyu w3 de zaten açıklıyorlar. buraya aktarıyorum olduğu gibi.
*****
In JavaScript, the thing called this is the object that "owns" the code.
The value of this, when used in an object, is the object itself.
*****
Yani diyorki, [s]this[/s] anahtar kelimesi objenin kendi kodudur, içinde kullanıldığı objeyi temsil eder bu yüzden tanımlanmış ve değiştirilemez bir değer olduğu için -- this does not have a value.-- başka bir değer alamaz. .this anahtar kelimesini objeyi objenin kendisi içinde kullanırken kullanıyoruz. (çok saçma geliyor ama açıklıcam)
Mesela benim resimleri yönettiğim, galerimde ileri geri yapmamı sağlayan bir objem var diyelim, aşağıda ES5 sınıfı oluşturalım.
// constructor
const ImageHandler = function (images) {
this.images = images;
};
// methodlar
ImageHandler.prototype = {
addImage: function (src) {
this.images.push(src)
},
getImage: function (index) {
return this.images[index]
},
list: function (index) {
return {
next: function () {
index++;
if (index > items.length - 1) {
index = 0;
}
return this.getImage(index)
},
prev: function () {
index--;
if (index < 0) {
index = items.length - 1;
}
return this.getImage(index)
}
}
},
}
Şimdi ben bu sınıfı dışarıda kullanırken ne yapıyorum önce bunu birdeğişkene atıyorum dğeil mi ?
let imageManager = new ImageHandler(["hasan.jpg","teoman.jpg"]);
ben bu sınıfın özelliklerine (property) ve metodlarına imageManager değişkeni ile erişebilirim. (Property'e özellik demek ne kadar doğru bilmiyorum ama ben böyle denildiğini gördüğüm için özellik deyip geçiyorum ama amerikan filmlerinde falan çok duymuşsundur bu kelimeyi. This my property nigga falan :D Yani burası benim mülküm, bu benim eşyam minvalinde. yani bu propertyler aslında tanımlandığı nesnenin bir parçası, eşyası mülkü haline geliyor. Ve nesne çapında içeride veya dışarıda kullanılabiliyor. )
let i = 0;
---click eventi ----
imageManager.next();
i++
----------------------
Peki ben obje yani sınıf içerisinde bu sınıfa ait değişkenleri kllanmak istersem o zaman ne olacak ? Sınıfın içinde tekrardan sınıf mı tanımlayacağım ? Böyle bir şeye gerek olmaması için, sınıf propertyleri ile metodları arasında iletişimi daha akıcı bir şekilde sağlamak için [s]this[/s] anahtar kelimesi var. Javascriptte this üretilmiş olan sınıfın kendisini verir. Mesela php de sınıfı elde etmenin farklı yolları vardır this, self ve static gibi. Bu methodlarda sınıfı temsil eder ancak bazı farklılıkları var. Mesela this instanceyi temsil ederken, self doğrudan sınıfın kendisini temsil eder.Ama bunlarla olayı karıştırmayım sadece örnek olarak verdim, php de olan olaylar bunlar.
burada constructor şeklinde kullandığımdan dolayı bike fonksiyonunun
console.log(this.name + " " + maker); // undefined Bajaj
yukarıdaki ifadesini aşağıdaki ifadeye çevirdi
console.log(obj.name + " " + maker);
this.name dediğinizde undefined hatası alıyorsunuz çünkü javascript kodları derlenirken tarayıcı this.name e geldiğince gidip bu sınıfa bakıyor ve "name" adlı bir property arıyor. Ancak bulamıyor, çünkü bu bir property değil, block scope tanımlanmış bir değişken. Nesne ile bir bağlantısı yok, constructor içerisinde tanımladığınız ve ancak constructor içerisinde kullanabileceğiniz, dışarıdan erişime kapalı olan basit bir değişken.
O yüzden this.name hatalı bir kullanım oluyor burada, doğrudan "name" demelisiniz.
maker ise "this.maker" şeklinde tanımladığınız için, yani artık bu objenin bir parçası haline geldi, arrtık basit bir değişken değil "maker" artık bir property ve "maker" property'isine hem obje içerisinden hem de obje dışarısından ulaşabilirsiniz.
Obje dışında kulanırken;
obj = new bike();
obj.maker
diyoruz ve bu property'e ulaşabiliyoruz.
Obje içerisinde "maker" property'sini kullanırken ise, "this" o objeyi temsil ettiğinden "this.maker" şeklinde bu property'e erişiyoruz.
En azından benim bu konu hakkında okuduğum bildiğim bu kadar, biraz daha yazarım aslında ama ne yazayım yoruldum hacı ya. Takıldığın bir yer olursa sor yine sen. Ayrıca constructor metodlarınızı büyük harfle yazın hocam, bu sayede sonradan biri kodunuza bakarsa onun bir constructor olduğunu fark eder.