JavaScript Temelleri

Bölüm 4

Object Nesne Sınıfı (devam)

Bölüm 4 Sayfa 2

4.2.4- Object Nesne Sınıfı Prototipinin hasOwnProperty() Metodu

Generik Nesne Prototipinin () metodunun kullanımı,

nesne.hasOwnProperty('özellik');
		

şeklindedir. Bu metot, sınandığı özellik, nesnenin kendi özellikleri arasında ise, true aksi halde false sonucunu döndürür. Bu metot, sadece nesnenin düzeyindeki özellikleri gözönüne alır, Prototip zincirinin üst halkalarındaki, üst sınıf özelliklerini dikkate almaz. Doğal olarak bu nedenle kullanım alanı kısıtlıdır.

Aşağıda, görülen, JavaScript programı, constructor özelliğinin, generik nesne prototipinin bir özelliği olup olmadığını sınamaktadır. Bu programın bağlı olduğu uygulama sayfasında görüntülenen sonucu aşağıda görülmektedir.

...
sonuçYaz('Object.prototype.hasOwnProperty("constructor")', Object.prototype.hasOwnProperty("constructor"), 'b4.2.5-uyg-1-sonuç-1');
...
		

Program Sonucu :

Bu metotla sorgulanan özellik bir metotsa, fonksiyon çağırma işlemcisi () kullanılmadan, fonksiyon ismi, bir karakter dizgisi verisi halinde argüman olarak kullanılır. Örnek olarak,

nesne.hasOwnProperty('toString');
		

nesnenin toString() metodu olup olmadığını kontrol eder. JavaScript programlama dili küçük/büyük harf ayrımı yaptığından, sorgulanan özelliğin, yazılımın gerçek özellik değerini yansıttığına emin olmak gerekir.

hasOwnProperty() Metodu, sadece incelenen nesne sınıfında tanımlanmış özellikleri kontrol eder. Sorgulanan özellik, nesnenin kalıtımla edindiği özelliklerden biri ise, sorgulanan özellik gerçekte var olduğu halde false yanıtı alınır yani bu sorgulama yanlış sonuç verir.

4.2.6- Object Nesne Sınıfı Prototipinin isPrototype() Metodu

Bu metodun amacı, nesnesnin gerçek prototipinin kontrol edilmesidir. Kullanımı,

NesneSınıfı.prototype.isPrototypeOf(nesne);
		

şeklindedir. Burada,

NesneSınıfı : çekirdek veya kullanıcı tanımlı veya konuk eden ortam kaynaklı bir nesne sınıfıdır.

nesne : Prototipi sorgulanan herhangibir nesne örneğidir.

Aşağıda, bu konudaki bir JavaScript programının bir uygulama sayfasında verdiği sonuç görülmektedir:

...

var a = {}; 
sonuçYaz('Object.prototype.isPrototypeOf(a) = ', Object.prototype.isPrototypeOf(a), 'b4.2.6-uyg-1-sonuç-1');
...
		

Program Sonucu :

Nesnelerin prototip kontrolü, generik nesne prototipinin constructor özelliğinden yararlanılarak da yapılabilir. Aşağıda, bu konudaki bir JavaScript programının bir uygulama sayfasında verdiği sonuçlar görülmektedir:

...
var a = {}; 
sonuçYaz('a.constructor == Object = ', a.constructor== Object, 'b4.2.6-uyg-2-sonuç-1'); 
... 
		

Program Sonucu :

Görüldüğü gibi, her iki metot da, nesnenin prototipinin sınanması için uygundur.

4.2.7- Object Nesne Sınıfı Prototipinin propertyIsEnumerable() Metodu

Bu metot şanssız bir metottur, çünkü spesifikasyonda yapılan bir daktilo hatası sonucu, JavaScript yorumlayıcıları bu metodun yetersiz bir versiyonu ile oluşturulmuştur.

Bu metodun tasarım nedeni, tüm öntanımlı nesne özelliklerinin sayılamaz (not enumerable), kullanıcıların tanımladığı özelliklerin ise sayılabilir (enumerable) karakterde olmalarıdır. Bu metot başlangıçta, bir nesnenin tüm kullanıcı tanımlı özelliklerinin bir for..in döngüsü ile kolay yoldan dökümünü amaçlamış fakat bu metodun kalıtım ile edinilen özellikleri kapsamayacağı yanlışlıkla spesifikasyona girince, işlevini büyük ölçüde yitirmiş olarak JavaScript yorumlayıcılarına yerleştirilmiş, hata farkededildiğinde de çok geç olduğu anlaşılmıştır. Bu konuda, bugzilla.mozilla.org (hata 57048) kaynağından daha fazla bilgi edinilebilir.

propertyIsEnumerable() Metodunun kullanım şekli aşağıdaki gibidir:

nesneÖrneği.propertyIsEnumerable('');
		

Metodun bugünkü yerleşim şekli nedeni ile, argüman olarak, sadece nesnenin kendi kullanıcı tanımlı özelliklerinden biri kullanıldığında metot doğru yanıt verebilmektedir. Eğer argüman olarak kulanılan özellik, sayılabilir fakat kalıtımla edinilmiş ise, özellik olmasına karşın, yanıt hatalı olarak false olacaktır. Aşağıda, bu konudaki bir JavaScript programının bir uygulama sayfasında verdiği sonuçlar görülmektedir:

...
var a = {x : 1, y : 3};

sonuçYaz('a.propertyIsEnumerable(x) = ', a.propertyIsEnumerable('x'), 'b4.7.2-uyg-1-sonuç-1');
...
		

		

Program Sonucu :

4.3 - Object Nesne Sınıfı Örnekleri

Generik nesne örnekleri veya Object nesne sınıfı örneklerinin nasıl yaratılacağı 4.1 de açıklanmıştı. Daha önce incelenmiş olan nesne literalleri de birer generik nesne örneğidir.

Nesne örneklerinin kendilerine özgü bir prototype özellikleri yoktur. Nesne örnekleri, oluşturuldukları yapılandırıcı fonksiyonun prototipini paylaşırlar. Object nesne sınıfı örneklerinin prototipi Object.prototype nesnesidir.

Generik nesne sınıfı olan Object sınıfı örnekleri, Object sınıfının prototipini paylaştıkları için, oluşmaları ile birlikte Object sınıfının tüm özelliklerine sahip olurlar. Bunlara ek olarak başka bir özellikleri yoktur.

4.4 - Object() Fonksiyonun Tip Dönüştürücüsü Olarak Kullanılması

Object() fonksiyonu, yapılandırıcı olarak kullanılmadığında, ilkel değerleri nesne literallerine dönüştürmek için kullanılır. Kullanımı,

Object(ilkel değer)
		

şeklindedir. fonksiyon geriye Object sınıfından bir nesne örneği döndürür.

İlkel değerleri, nesne literallerine dönüştürmenin tek avantajı, bu literallere yeni özellikler eklenebilmesidir. Bu konuda bir JavaScript fonksiyonun, bir uygulama sayfasında verdiği sonuç, aşağıda görülmektedir:

...
var nokta = null;
nokta = 3.23;
nokta = Object(nokta);
nokta.y = 4.22;
sonuçYaz('noktanın ordinatı = ', nokta.y, 'b4.4-uyg-1-sonuç-1');
...
		

Program Sonucu :

Program sonucundan, nokta değişkeninin ilkel sayısal değerden, bir generik nesne sınıfı örneğine dönüştüğü görülüyor. Dönüşümün gerçekleştiği şüphesizdir. Çünkü aksi olsaydı, JavaScript yorumlayıcısı, asla bir ilkel sayısal değere özellik eklenmesine olanak vermezdi.

Object () fonksiyonu bir argüman olmadan kullanılırsa, yeni bir boş generik nesne örneği (boş literal, Object sınıfı nesne örneği) yaratır. Yani,

malzeme = new Object();
		

ile,

malzeme = Object();
		

ve

malzeme ={};
		

bildirimleri eşdeğerdir. Yine de, new bildirimin kullanılmaması çok sıradışıdır ve programın ileride okunabilirliğini azaltır. En çok tercih edilmesi gereken sonuncu form olmalıdır.

Valid XHTML 1.1