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

Disaridan Erisime Kapali Özellikler

Disaridan Erisime Kapali Özellikler

C Tabanli programlama dillerindeki class yapilarinda, methodlarin disarindan erisime açik olup olmadigi belirtilebilir.ECMAScript'in yeni sürümündeki class yapilari da public/private alt method ve degerleri destekler.
Su an kullandigimiz sürümde de public/private özellikler olusturulabiliyor, bunun için fonksiyon bloklarinin etki alanlarindan faydalanilir;
>>> function test(){
var _deger = "merhaba dünya!"; this.degeriGetir = function(){ return _deger;
}
}
Yukaridaki örnekte test adinda bir fonksiyon olusturduk ve biri disaridan erisime kapali, iki deger olusturduk.
>>>test1 = new test();
>>>test1._deger undefined
>>>test1.degeriGetir() "merhaba dünya!"
...

 Bir sonraki yazı Apply

6 Ağustos 2012 Pazartesi

Fonksiyonlar için method ve alt değişken tanımlamak

ECMAScript'te, fonksiyonların her biri diğer dillerde rastladığımız "class"'lara benzer, alt değerler tanımlanabilir ve new operatörüyle klonlanabilir.
Alt değer tanımlamak için, fonksiyonun içindeki "this" değerine erişilir.Alt değerler fonksiyon bloğunun dışında da tanımlanabilir. Bir örnek;
>>> var islemci = function(){
this.aciklama = "merhaba dünya!"
this.toplama = function()
{
return arguments[0]+arguments[1];
}
this.cikarma = function(sonuc)
{
return arguments[0]-arguments[1];
}
}
>>> var islem1 = new islemci();
>>> islem1.toplama(3,5);
8
>>> islem2.cikarma(3,5);
-2
islemci adında, toplama cikarma methodlarını içeren bir fonksiyon yarattık ve ardındaki satırda, islem1 tanıtıcısına yeni bir islemci objesini
atadık.Bu kez, az önce yazdığımız islemci objesinde, prototypeı kullanarak yeni bir alt method yaratalım;
 >>> islemci.prototype.carpma = function(){
return arguments[0]*arguments[1];
}
>>> var islem2 = new islemci();
>>> islem2.carpma(3,5);
15
 prototype Klonlanabilir nesnelerin ortak etki alanına sahip olmasını sağlayan bir değerdir.Eğer prototypeı kullanmadan tanımlama yaparsak, alt
methodu olduğumuz objenin etki alanına yani içerdiği değerlere erişemeyiz.Buna bir örnek verelim:
 >>> islemci.prototype.aciklamayiGoster1 = function(){
return this.aciklama;
}
>>> islemci.aciklamayiGoster2 = function(){
return this.aciklama;
}

 Görevleri islemci objesine ait aciklama değerini döndürmek olan etki alanları farklı, iki tane fonksiyon tanımladık.İlk tanımladığımız fonksiyonu
deneyelim:
 >>> islemci.aciklamayiGoster1()
"merhaba dünya!"
 Gördüğünüz gibi, islemci nesnesine prototype köprüsünden erişti ve içerdiği değerleri aldı.Diğerini deneyelim:
 >>> islemci.aciklamayiGoster2()
undefined
Tanımlanmamış değer döndürdü çünkü etki alanı kendisiydi.sadece kendi içindeki ve window altındaki değerlere ulaşabilirdi.Elbette bu problem
çözümsüz değil, call ve apply methodları fonksiyonların etki alanını belirlememizi sağlar.

...
Bir sonraki konu Dışarıdan Erişime Kapalı Özellikler










1 Ağustos 2012 Çarşamba

Argümanlar

JAVASCRİPT FONKSİYON ARGÜMANLARI

Fonksiyonlar, sadece faaliyet alanlarında erişilebilir durumda olan değerler alabilirler.Bu değerlerin tanıtıcısı, fonksiyon oluşturulurken argüman
tünelinde yazılır.Fakat gönderilen argümanlar için tanıtıcı belirtmek zorunlu değildir, tanıtıcı olsun veya olmasın, fonksiyon içindeki "arguments"
tanıtıcılı değişken argüman tünelindeki tüm verileri saklar.
Diziler, tek tanıtıcının altında veri parçalarını tanıtıcıya ihtiyaç kullanmadan saklamayı sağlayan veri türüdür, örnek olarak herbiri tek başına bir
değer olan birkaç elmayı tutan sepeti düşünelim.Sepeti tutan el, programımızı çalıştıran browser olmalı :) Fonksiyonlardan bir sonraki konu
başlığında dizileri daha detaylı inceleyeceğiz.
Az önce sözünü ettiğim "arguments" değeri, fonksiyonların argüman tünelinden gelen tüm değerleri sıralı olarak saklayan bir dizidir.Tanıtıcısı olsun
veya olmasın, browserlar gönderilen tüm argümanlara erişmemizi sağlar.Bir örnek;

 >>> var argumanlar = function(){
return arguments;
}
>>> argumanlar(3,5);
3,5
>>>

Örnekte "argumanlar" adında, tek işlevi kendisine gelen argümanları geri döndürmek olan bir fonksiyon oluşturduk ve bu fonksiyona gönderdiğimiz
argümanların bize dizi tipinde geri döndüğünü gördük.Toplama örneğini "arguments" dizisinin elemanlarını seçip işlem yaptırarak yeniden ele
alalım:

>>> var toplama = function(){
return arguments[0]+arguments[1];
}
>>> toplama(3,5);
8

Bu örnekte arguments dizisinin ilk iki elemanını, tanıtıcıları olan sıra numaralarıyla seçtik ve toplamlarını bulup geri döndürdük.Dizileri henüz iyice
anlamadığınızı düşünüyorsanız endişelenmeyin, dizileri ayrı bir başlıkta detaylı biçimde inceleyeceğiz.
Fonksiyonların içinde kaç argüman tanımlandığını bulmak içinse, fonksiyon tanıtıcısının alt değişkeni olan .length değeri kullanılır.Örnek olarak,
argüman tünelinde tanımlanan değişkenlerin sayısını gönderen bir fonksiyon yazalım:

>>> function test(arguman1,arguman2){
return test.length;
}
>>> test()
2

 ...
 Bir sonraki konu : Fonksiyonlar için method ve alt değişken tanımlamak