lostyazilim
tr.link

javascript'te kodun çıktısını anlamadım, yardım eder misiniz ?

6 Mesajlar 1.074 Okunma
acebozum
tr.link

msyysm msyysm WM Aracı Kullanıcı
  • Üyelik 03.03.2018
  • Yaş/Cinsiyet 27 / E
  • Meslek öğrenci
  • Konum Bursa
  • Ad Soyad M** Y**
  • Mesajlar 48
  • Beğeniler 29 / 2
  • Ticaret 0, (%0)

function bike() {
var name = "Ninja";
this.maker = "Kawasaki";
console.log(this.name + " " + maker); // undefined Bajaj
}

var name = "Pulsar";
var maker = "Bajaj";

obj = new bike();
console.log(obj.maker); // "Kawasaki"





Yukarıdaki kodun aşağıdaki parçasındaki kısmında "this.name" "bike()" function'u içerisinde olduğundan global objeyi göstermesi gerekmez mi ? bir de aşağıdaki kodda "maker" variablı neden "Bajaj"ı gösteriyor ben "Kawasaki"yi gösterir diye düşünüyordum ama console'da deneyince öyle olmadı nedenini söyleryebilir misiniz ?




console.log(this.name + " " + maker);





_________________________________________________________

Bir de yine benim bildiğim kadarıyla aşağıdaki kısımda this global scope'taki maker göstermesi lazım diye düşünüyorum ama büyük ihtimalle de yanlış düşünüyorum buradaki this'in neyi ifade ettiğini açıklayabilir misiniz ?



this.maker = "Kawasaki";





_____________________________________________________________


NOT: Örneği aldığım site : https://codeburst.io/all-about-this-and-new-keywords-in-javascript-38039f71780c bu linkte de açıklama veriyor ama ingilizcem yetmedi :D

Şİmdiden teşekkürler arkadaşlar.
 

 

elektronikssl
webimgo

hsntngr hsntngr Kontör at Kullanıcı
  • Üyelik 21.09.2016
  • Yaş/Cinsiyet 31 / E
  • Meslek Full Stack Developer
  • Konum İstanbul Avrupa
  • Ad Soyad H** T**
  • Mesajlar 1155
  • Beğeniler 99 / 327
  • Ticaret 3, (%100)
Undefined demesinin nedeni tanımladığınız bir block scope değişkeni sınıfın bir özelliği gibi kullanmanızdan kaynaklanıyor hocam.


function bike() {
var name = "Ninja";
this.maker = "Kawasaki";
console.log(this.name + " " + maker); // undefined Bajaj
// name + this.maker şeklinde olmalı
}

----------------------

maker artık sınıfın bir özelliği olduğu için daha sonradan bu özelliğe ulaşabilir ve onu değiştirebilirsiniz. Ancak name değeri block scope bir değişken olduğu için ona dokunamazsınız.


obj = new bike();
obj.maker = "Bajaj"


Bu adımdan sonra objeyi konsolda yazdırırsanız "Ninja Bajaj" değerini görürsünüz. Muhtemelen bajaj değeri almanızın nedeni funksionu tanımladığınız yer ile çalıştırdığnız yer arasında bu değeri değiştiren yukarıdaki gibi bir kod var.
-----------------------
"this" nesne tabanlı programlamada objeyi temsil eden ve bütün programlama dillerinde kullanılan önceden belirlemiş bir değişkendir. Dolayısıyla javascriptte bütün fonksiyonlar aynı zamanda birer obje olduğu için javascriptte fonksiyonların içinde this kullanabilyorsunuz. Tıpkı es5 (zaten isimsiz fonksiyon gibi tanımlanıyor) ve es6 sınıflarında olduğu gibi.
msyysm

kişi bu mesajı beğendi.

msyysm msyysm WM Aracı Kullanıcı
  • Üyelik 03.03.2018
  • Yaş/Cinsiyet 27 / E
  • Meslek öğrenci
  • Konum Bursa
  • Ad Soyad M** Y**
  • Mesajlar 48
  • Beğeniler 29 / 2
  • Ticaret 0, (%0)

var obj = {

prop: 5,
prop2: "asdasd",

prop3 : function o() {


console.log(this.prop); // buradaki gibi mi çağırdınız demeye çalışıyorsunuz this.name diyerek
// kafamda farklı bir kaç şey daha takıldığı için tekrar sorma ihtiyacı duydum


}



}





____________________________________________________


bir de hala daha anlamadığım yer cevabınızda : this.maker ne anlama geldiği.

ben daha önceden c#'tan bilidğim kadarıyla this global scope'taki elemana erişiyordu o yüzden kafam karışıyor biraz sanırsam, yani üstat senden istediğim şu cümleni biraz daha açabilir misin ?

" "this" nesne tabanlı programlamada objeyi temsil eden ve bütün programlama dillerinde kullanılan önceden belirlemiş bir değişkendir. Dolayısıyla javascriptte bütün fonksiyonlar aynı zamanda birer obje olduğu için javascriptte fonksiyonların içinde this kullanabilyorsunuz. "
 

 

msyysm msyysm WM Aracı Kullanıcı
  • Üyelik 03.03.2018
  • Yaş/Cinsiyet 27 / E
  • Meslek öğrenci
  • Konum Bursa
  • Ad Soyad M** Y**
  • Mesajlar 48
  • Beğeniler 29 / 2
  • Ticaret 0, (%0)
yani "this"in objeyi temsil ettiği biliyorum, zaten siz de öyle söylemişsiniz. Ama daha sonradan fonksiyonların obje olduğunu söylemişsiniz bunu da anladım. Ama fonskiyonların obje olduğu için içinde this kullabileceği kısmını anlamadım
 

 

wmaraci
wmaraci

msyysm msyysm WM Aracı Kullanıcı
  • Üyelik 03.03.2018
  • Yaş/Cinsiyet 27 / E
  • Meslek öğrenci
  • Konum Bursa
  • Ad Soyad M** Y**
  • Mesajlar 48
  • Beğeniler 29 / 2
  • Ticaret 0, (%0)
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."



daha sonra sizin verdiğiiz gibi şu kodu denedim :


function bike() {
var name = "Ninja";
this.maker = "Kawasaki";
console.log(name + " " + this.maker);

}


daha sonra


oba = new bike();



diyerek bike'ı constructor olarak kullandım
ve daha sonra aşağıdaki gibi bir kod yazdığımda


console.log(oba.maker); // Kawasaki



ve daha sonra yazdığım diğer kod ise

console.log(oba.name); // undefined



olarak çıktı aldım yani sanırsam ilk başta verdiğim kodda yani aşağıdaki gibi olan kodda

function bike() {
var name = "Ninja";
this.maker = "Kawasaki";
console.log(this.name + " " + maker); // undefined Bajaj
}

var name = "Pulsar";
var maker = "Bajaj";

obj = new bike();
console.log(obj.maker); // "Kawasaki"


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);





ve de var name = "Ninja"; kısmını direkt aıp oba objesinin içine {maker: "Kawasaki"} yaptı

aşağıdaki resimde gözüktüğü gibi
resimag.com/p1/6a591c0c56.png
 

 

hsntngr hsntngr Kontör at Kullanıcı
  • Üyelik 21.09.2016
  • Yaş/Cinsiyet 31 / E
  • Meslek Full Stack Developer
  • Konum İstanbul Avrupa
  • Ad Soyad H** T**
  • Mesajlar 1155
  • Beğeniler 99 / 327
  • Ticaret 3, (%100)
Hocam öncelikle beni etiketler veya alıntılarsanız ancak bana yazdıklarımdan haberim olur, bildirim gelir. Geri dönüp bakmasam muhtemelen sorularınızı göremeyecektim.. O yüzden bir hatırlatayım dedim. Birisine soru sorarken , mesajınıza bu kişiyi etiketlemeyi veya alıntılamayı unutmayın bildirim gitmesi için


msyysm adlı üyeden alıntı

.. 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

msyysm adlı üyeden alıntı


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.
Bulutekno msyysm

kişi bu mesajı beğendi.

wmaraci
wmaraci
Konuyu toplam 1 kişi okuyor. (0 kullanıcı ve 1 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al