9 Ağustos 2012 Perşembe

Apply

Apply
apply Javascript'in isviçre çakisidir.Bu özellik sayesinde, fonksiyonlar birbirlerinin yapilarinin üstüne insa edilebilir ve bunun saymakla bitmez faydalarindan biri, modern object oriented dillerinin kalitim özelligini bize saglamasidir.Örnegin, kimlik bilgileri içeren "kisi" objesi üzerine, skor ve benzeri bilgileri içeren "oyuncu" objesi olusturalim:
>>> var kisi = function(adsoyad,yas,dogumyeri){ this.adsoyad = adsoyad;
this.yas = yas; this.dogumyeri = dogumyeri;
}
>>>var arda = new kisi("Arda Koçulu",17,"Kars");
>>>arda.dogumyeri
"Kars"
Kisi objesini inceleyelim; bir fonksiyon olusturduk ve argüman tünelinden gelen üç veriyi bu fonksiyona alt deger olarak atadik.Ardindaki satirda "arda" degerini "new" operatörüyle yeni bir kisi olarak tanimladik.Kisi objesini olusturdugumuza göre, oyuncu objesine de geçebiliriz:
>>> var oyuncu = function(adsoyad,yas,dogumyeri,takim,skor){ this.takim = takim;
this.skor = skor; kisi.apply(this,arguments);
}
>>>var kemal = new oyuncu("kemal akin",15,"antalya","maviler",3);
>>>var ege = new oyuncu("ege akin",10,"izmir","kirmizilar",2);
>>>kemal.takim
maviler
>>> ege.dogumyeri izmir
Oyuncu adinda bir nesne olusturduk, argüman tünelinden bekledigimiz degerleri taniticilarina tanimladiktan sonra, takim ve skor alt degerlerini atadik.Ardindan gelen satirda ise, kisi objesinin apply methodunu çalistirdik ve "this","arguments" argümanlarini gönderdik. "this" argümani, kisi objesinin hangi fonksiyon tarafindan çagrildigini göndermek için kullanilir.arguments Argümaniysa, apply methoduyla çagrilan fonksiyonun argüman tünelinden bekledigi argümanlari göndermemizi saglar."arguments" degeri, oyuncu fonksiyonuna gelen degerleri içerdiginden, "oyuncu"
fonksiyonuna gelen tüm argümanlar "kisi" fonksiyonuna gönderililir.
Call
call fonksiyonu tipki apply gibi, fonksiyonlari kendi belirledigimiz etki alani ve argümanlarla çalistirmamizi saglar.Bir problemin çözümünü anlatarak örnek yapalim, javascript arguments dizisinin alt methodlarini kullanmamiza olanak tanimaz.Deneyelim;
>>> (function(){
alert(arguments.slice); // undefined deger döner })("merhaba","dünya");
Parantez bloklari içindeki fonksiyonumuza iki metinsel deger gönderdik.Fonksiyondaysa, gelen argüman listesinin slice methodunu kontrol ediyoruz ve tanimlanmamis oldugunu görüyoruz.
Simdi bu problemin çözümünü inceleyelim:
>>> (function(){
alert(Array.prototype.slice.call(arguments,1) // dönen deger: ["dünya"] })("merhaba","dünya");
slice Methodunun islevi o kadar önemli degil, diziler konusunda inceliyoruz.Burada dikkat etmeniz gereken, prototipteki fonksiyon kaynagina ulasmamiz ve bu fonksiyonu call methodu ile çagirmamiz.call nesnesine gönderdigimiz argümanlardan birincisi etki alanini belirliyor, digeri ise slice methodunun argüman tünelinden bekledigi ilk deger. Gördügünüz gibi, call methodu applyden farkli olarak argümanlari topluca liste olarak almiyor, ilk argümani etki alani degeri kabul edip diger bütün argümanlari çalistirdigi fonksiyona aktariyor.
...  
bir sonraki yazı Call ile kalitim

Hiç yorum yok:

Yorum Gönder