JavaScript Temelleri

Bölüm 4

Object Nesne Sınıfı

Bölüm 4 Sayfa 1

4.1 - Object Nesne Sınıfı Örnekleri Yapılandırıcısı

Nesnelerle çalışma yöntemleri 2.6 bahsinde, JavaScript nesne teknolojisi 3.4.5 bölümünde detaylı olarak incelenmiştir. Object nesne sınıfı incelenmeden önce bu konularaın yeniden incelenmesi yararlı olacaktır.

Object nesne sınıfı örneklerinin yapılandırıcısı Object () fonksiyonu, yeni Object nesne sınıfı örneklerinin yapılandırılmasında kullanılır. Kullanımı,

değişken = new Object([değer]);
		

şeklindedir. Burada

değişken = yeni Object sınıfı nesne örneğinin atandığı değişkenin adıdır.

Object() Generik nesne sınıfı örneği yapılandırıcısının yapılandırdığı yeni Object sınıfı nesne örneğinin başlangıç özellikleri, Object() generik nesne yapılandırıcısının çağrılmasında kullanılmış olan argümanın değerine bağlıdır.

generik nesne yapılandırıcısı,

değişken = new Object();
		

veya

değişken = new Object(undefined);
		

veya

değişken = new Object(null);
		

ise, boş bir generik nesne sınıf örneği yaratılır. Bu, aynı zamanda boş bir nesne literali anlamına da gelir ve aynı sonuç,

değişken = {}; 
		

bildirimi ile de elde edilir. Bu durumda, yeni yaratılan generik sınıf nesnesi örneğinin veri tipi object olur ve yapısı, generik nesne sınıfının prototipi olan Object.prototype , nesnesinin yapısı olur. Yani, yeni yaratılmış olan generik nesne sınıfı örneğinin değer ve metot özellikleri, generik nesne sınfının değer ve özellikleri ile aynı olduğu gibi, generik nesne sınıfının yapısındaki özelliklere atanmış olan başlangıç değerlerinin aynısı da yaratılan nesne örneğinin yapısındaki özelliklere atanmış olur. Doğal olarak, boş bir generik nesne sınıfı örneğinin ilkel değer karşılığı yoktur.

Generik nesne örnekleri yapılandırıcısının argümanının değeri, mantıksal, sayısal veya sözel bir değer ise, yeni bir generik nesne sınıf örneği yaratılır ve bu yeni yaratılmış generik nesne örneğinin içsel [[Value]] özelliğine, başlangıç değeri olarak, argümanın değeri atanır. Bu şekilde, yapılandırıcı fonksiyonun çağrıldığı tek değerle yapılandırılmış olan generik nesne sınıfı örnekleri, karşılıkları olan ilkel veriler gibi aynı şekilde programlarda kullanılabilirler. Örnek:

a = new Object(8);
		

bildirimi sonunda, yaratılan generik nesne sınıfı örneğinin ilkel değer karşılığı 8 fakat veri tipi object dir. Bu nesne örneği, aynı a =8 şeklinde atanmış gibi aritmetik işlemlere girebilir. Örnek olarak, a*6 işleminin sonucu 48 ve tipi number olacak fakat a nın tipi yine değişmeden object olarak kalacaktır.

Boş olarak yaratıldıktan sonra, içeriği aşağıdaki gibi güncellenmiş,

ordino = new Object();
ordino.nr = 16;
		

olan veya doğrudan bir nesne literali olarak aşağıdaki gibi yaratılan

ordino = {nr : 16};
		

generik nesne sınıfı örneklerinin, sayısal karşılığı olmadığı kabul edilir.

Generik nesne yapılandırıcısının argümanın değeri, bir nesne sınıf örneği ise, yeni bir generik nesne örneği yaratılmaz ve argümanın değeri geri döndürülür.

Generik nesne örnekleri yapılandırıcısının kullanabileceği en fazla argüman sayısını belirten length özelliğinin değeri 1 olduğundan, bu fonksiyon ancak en çok 1 argüman ile çağrılması gerekir Fakat yapılandırıcı fonksyionlar, en yüksek hata toleransı ile çalışırlar. Eğer argüman sayısı birden fazla ise sadece ilk argüman gözönüne alınır. Eğer hiç argüman kulanılmadan new bildirimini takip ederek çağrılırsa belirtilmeyen argümanların değeri verilmediği kabul edilerek yeni bir boş generik nesne örneği yaratılır.

Generik nesne örnekleri yapılandırıcısının en uygun kullanım şekli boş bir generik nesne örneğinin yaratılmasıdır. Diğer argüman değerleri uygun değildir. Sayısal, sözel ve mantıksal değerler, çok özel durumlar dışında ilkel değerler olarak kullanılırlar. Çok sıradışı olarak, nesne örneği olarak tanımlanmaları gerekirse, en uygunu genel generik nesne olarak değil, kendi öz alt nesne sınıflarının örnekleri olarak, Boolean(), String(), Number(), sınıf örnekleri yapılandırıcı fonksiyonlarının kullanımı ile gerçekleştirilmesi daha uygundur.

4.2 - Object Nesne Sınıfı Örnekleri Yapılandırıcısının prototype Özelliği

Generik nesne sınıfı örnekleri yapılandırıcısı Object () fonksiyonunun, prototype özelliğinin değeri, generik nesne sınıfının prototip nesnesidir. Aşağıdaki şekil bu konumu açıklamaktadır:

prototip nesnesi

Şekil 4.2 -1 Object.prototype Özelliğinin değeri

Daha önce 3.4.5 bölümünde, bir nesne sınıfı yapılandırıcı fonksiyonunun prototype özelliğinin değerinin, o yapılandırıcı fonksiyonun yapılandıracağı nesne sınıfı türünde olacağı belirtilmişti. Bu prensibe göre, Object.prototype Özelliğinin değeri de bir Object nesnesi olacaktır. Bu nesne Object sınıf nesnesidir ve Object nesne sınıfının prototipi olarak adlandırılır. Tüm nesne sınıflarının prototipleri gibi, Object nesnesi prototipi de güncellenebilen bir veri yapısıdır ve güncel değeri, her yeni oluşturulan generik nesne sınıfı örneğinin yapısını oluşturur.

ECMA-262 spesifikasyonu, Object nesne sınıfı prototipi için önemli bilgiler vermektedir. Bunlardan ilki, Object nesne sınıfı prototipinin içsel [[Prototype]] özelliğinin değerinin null olduğudur. Bu bilgi, Object nesne sınıfı prototipinin, yapısının orijinal olduğu, hiçbir nesneden aktarılmadığını belirtmektedir. Dolayısı ile Global JavaScript Nesnesinin tüm nesnelerin üst sınıfı olduğu en teknik açıdan doğru değildir. Fakat fiilen, Global JavaScript Nesnesi tüm nesne sınıflarına, bu arada generik nesne sınıfına özelliklerini kalıtımla aktarır. Bu konu JavaScript yorumlayıcısının yazılımı ile ilgilidir ve kullanıcıyı sadece fiili durum ilgilendir. Spesifikayon, tüm JavaScript nesne sınıf prototiplerinin içsel [[Prototype]] özelliklerinin Object.prototype nesnesi olacağını belirtir. Bu da tüm nesnelerin gerçek atasının Object.prototype nesnesi olduğunu belirtir.

Spesifikasyonda, Object.prototype nesnesi için verilmiş olan ikinci önemli bilgi ise, içsel [[Class]] değerinin, "Object" sınıfı olarak belirlendiğidir. Bu değer, diğer tüm nesne sınıflarının içsel [[Prototype]] değeri olacaktır. Yani tüm deiğer sınıfların prototiplerinin başlangıç değeri, generik nesne sınıfı prototipi olacaktır. Bu yüzden JavaScript programlama dilinde, tüm nesnelerin üst sınıfı Object nesne sınıfıdır. Object sınıf nesnesinin, diğer tüm öntanımlı veya kullanıcı tanımlı sınıf nesnelerinin üst sınıfı olmasından dolayı, Object nesne sınıfına, generik (tüm nesne türlerinin oluşturucusu - anaç) nesne sınıfı adı da verilir.

Tüm öntanımlı ve kullanıcı tanımlı JavaScript nesnelerinin prototiplerinin, temelde Object nesne sınıfı prototipinin tranferi ile oluştuğunu gerek ECMA-262 standardından, gerekse 3.4.5 bölümünde yapmış olduğumuz incelemelerden anlaşılabileceği gibi, boş bir nesne literali yaratarak özelliklerinin incelenmesi ile, boş olarak yaratılan bir nesne literaline hem Global JavaScript Nesnesinin tüm özelliklerinin, hem de Object nesne sınıfı prototipinin tüm özelliklerinin kalıtımla aktarılmış olduğu gözlenerek de anlaşılabilir.

Generik nesne sınıfı prototipi, generik nesne sınıfından bir nesnedir ve belirgin bir ilkel değer karşılığı olmayan veya boş olan her generik nesne sınıfı örneği gibi, çağrıldığında aşağıda göreceğimiz toString() metodunun sonucunu (aslında içsel [[Value]] özellik değerini) döndürür. Bölüm 3.4.3 de, bir programla bu prototip nesnesinin yapısı sorgulanmak istendiğinde, bunun bir nesne olduğu ,dolayısı ile veri tipinin object olduğu, içsel [[Class]] özelliğinin değerinin "Object" olduğu ve bu bir iç kod olduğundan, yazılımın kullanıcıya kapalı olduğu sonucu alınmıştır.

Object nesne sınıfının prototipinin özellikleri JavaScript yorumlayıcısının öntanımlı bir nesnesinin özellikleri olduğundan, sayılamaz niteliktedirler, dolayısı ile, for..in döngüleri ile görüntülenemezler. Tüm öntanımlı nesnelerin prototiplerinde olduğu gibi, Object nesne sınıfının prototipinin yazlımına erişim istekleri bu şekilde önlenmiş olduğundan, kullanıcının generik nesne prototipinin yapısını öğrenmek için, spesifikasyona başvurmaktan başka şansı kalmamaktadır.

ECMA-262 Spesifikasyonunda belirtildiğine göre, generik nesne sınıfının prototipinde 7 özellik bulunmaktadır. Bunlardan biri değer özelliği, diğer altısı fonksiyon özelliğidir (metot).

Generik nesne sınıfı prototipinin tek değer özelliği, Object.prototype.constructor özelliğidir. Generik nesne prototipinin metotları ise, toString(), toLocaleString(), valueOf(), hasOwnProperty(), isPrototypeOf(), propertyIsEnumerable() metotlarıdır.

4.2.1 - Object Nesne Sınıfı Prototipinin constructor Özelliği

Bu özelliğin değeri, nesneyi yaratan yapılandırıcı fonksiyonun yazılımının dökümüdür. Sadece kullanıcı tanımlı nesne sınıflarının yapılandırıcı fonksiyonlarının yazılımlarının dökümleri alınabilir. Öntanımlı nesnelerin yapılandırıcı fonksiyonların yazılımı kullanıcıya kapalıdır. Bu özelliğin değeri bir uygulama sayfası ile ilişkili aşağıdaki programda görüldüğü gibi sorgulanırsa, alınacak sonuç:

...

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

Program Sonucu :

olmaktadır. Bu yanıtın anlamı, generik nesne sınıfı prototipinin yapılandırıcısının öntanımlı Object() metodu olduğu, bu metodun yazılımının JavaScript yorumlayıcısının özgün kodu (native code) olduğu için, kullanıcıya kapalı olduğudur.

4.2.2- Object Nesne Prototipinin toString() Metodu

Generik Nesne Prototipinin toString() metodunun kullanımı,

this.toString();
		

şeklindedir. Burada, this nesnesi, bir sınıf prototip nesnesi veya bir sınıf örneği nesnesidir. Bu metot görünürde generik (polimorfik) tir ve her sınıftan nesne ile bir sonuç verir. Aslında, bu metodun verdiği sonuç son derece spesifiktir.

JavaScript programlama dilinde, Object sınfının prototip nesnesi, tüm nesne sınıfı prototip nesnelerinin atasıdır. Bunun sonucu olarak, tüm özellikleri gibi, toString() metodu da tüm alt sınıflara kalıtım ile aktarılır. Fakat, her nesne prototipinin yapısı farklı olduğu için, her nesne sınıfı prototipinde, toString() metoduna, sınıf yapısına daha uygun bir içerik yazılabilir. Metodun ismi aynı kalıp içeriğinin değiştirilmesine metot bindirmesi adı verildiğini daha önce görmüştük. Metot bindirmesinin yararlarından birisi, kullanıcının her nesne sınıfı ayrı bir sözele dönüştürme rutininin aramasına gerek kalmamasıdır.

JavaScript programlama dilinde, nesnelerin JavaScript yorumlayıcısının izlediği bir [[Class]] özelliği bulunmaktadır. Bu özelliğin değeri, genellikle nesne sınıf örnekleri yapılandırıcısının adıdır. Generik nesne sınıfı örneklerinin de içsel [[Class]] değeri ["Object"] olarak belirlenmiştir. JavaScript yorumlayıcısı, içsel [[Class]] özelliğinden, nesne örneklerinin ait olduğu nesne sınıfını algılamak için kulllanır. JavaScript yorumlayıcısı, toString() metodunun uygulanması istenen this nesnesinin [[Class]] özelliğinin değerine göre en uygun olan toString() metodu içeriğini bularak işlemi ona göre gerçekleştirecektir.

Tüm alt nesne sınıflarının prototiplerine, kalıtım yolu ile aktarılan Object nesne sınıfı prototipinin toString() metodunun içeriği, fazla detaylı bir bilgi sağlamamaktadır. Bu metot eğer this nesnesi boş bir nesne örneği ise, veya içeriğinin bir ilkel değer karşılığı yoksa (içsel [[Value]] özelliğinin değeri yoksa)

"object [" + Nesnenin [[Class]] Özelliği + "]"

şeklinde bir karakter dizigisi döndürür. Bu bilginin ilk kısmı, Object nesne sınıfı prototipinin bir nesne olduğu ve veri tipinin object olduğudur. Bilginin bu ilk kısmı, typeof() işlemcisi ile veri tipinin songulanması ile alınacak sonuçtur. Bu sorgulama,

bilgiYaz(typeof(Object.prototype), 'yazılacakYer');
		

şeklinde olacaktır ve alınacak sonuç doğal olarak nesne veri tipi olan object olacaktır.

Bu bilginin ikinci kısmı çok önemlidir ve nesnenin JavaScript yorumlayıcısı tarafından algılanan iç [[Class]] özelliğinin değerini açıklar. Bu özelliğin değeri genellikle yapılandırıcı fonksiyonların adıdır. Generik nesne sınıfının da [[Class]] özelliği, yapılandırıcı fonksiyonunun adı olan"Object" değeridir. JavaScript yorumlayıcısının konuk edildiği ortam tarafından tanımlanan "konuk eden ortam" (host) sınıfların [[Class]] özelliği window , document gibi sınıflardır. Kullanıcı tanımlı sınıflar generik nesne sınıfında oldukları için bunların [[Class]] özelliğinin değeri yine "Object" sınıfı olarak tanımlanmıştır.

Bir generik nesne sınıfı prototip nesnesinin toString() metodu ile döndürdürdüğü değer, bir web sayfasına bağlı olarak çalışan aşağıdaki JavaScript programı nın verdiği sonuçtan görülmektedir:

...

sonuçVeTipYaz('Object.prototype.toString() = ',Object.prototype.toString(), 'b4.2.2-uyg-1-sonuç-1');

...
		

Program Sonucu :

Generik nesne sınıfının prototip nesnesi, ilkel değer karşılığı olmayan birçok farklı tipte özellikten oluşan bir generik nesne sınıf örneğidir. Bu yüzden yukarıdaki sonuç alınmıştır. Dondürülen sonucun veri tipi, toString() metodunun döndürdüğü veri tipi olan string tipidir.

Yukarıdaki JavaScript programı ile 3.4.5 bölümünde uygulanmış olan, JavaScript programının sonuçlarınını görüntüleri aynı olmaktadır. Bu doğaldır, çünkü,

sonuçYaz(..Object.prototype.toString()..);

bildirimi, Object() generik nesne yapılandırıcısının, prototype özelliğinin değerini karakter dizigisi tipine dönüştür ve sonucu döndür anlamına gelmektedir. Aynı şekilde,

sonuçYaz(..,Object.prototype,...);

bildirimi, Object() generik nesne yapılandırıcısının, prototype özelliğinin değerini yazdır anlamına gelmektedir. Prensip olarak, belirgin bir ilkel değer karşılığı olmayan tüm generik nesne sınıfı örnekleri, değerlerine erişim için yapılacak çağrılara,

[object Object]

şeklinde yanıt vermektedir, fakat veri tipi object tipidir ve yanıt doğrudan kullanılamaz. Yani, her iki program da aynı değeri görüntülemektedirler, fakat birinin geri döndürdüğü değerin veri tipi string, diğerininki ise object veri tipidir.

Bir ilkel değer karşılığı olan generik nesne sınfı örneklerinde, toString() metodu, generik nesne sınıfı örneğinin ilkel değer karşılığını string tipinde döndürecektir. Bu konuda bir uygulama sayfasına bağlı JavaScript Programı ve verdiği sonuçlar aşağıda görülmektedir:

...

var yeniNumara = new Object(83); 

sonuçVeTipYaz('yeniNumara.toString() = ', yeniNumara.toString(), 'b4.2.2-uyg-2-sonuç-1');
			
...
		

Program Sonucu :

4.2.3- Object Nesne Sınıfı Prototipinin toLocaleString() Metodu

Generik Nesne Prototipinin toLocaleString() metodu, toString() metodu, ile karakter dizgisine dönüştürülecek olan, değerlerin, yerel kullanımına göre düzenlenmiş bir şekilde dönüştürülmesinin sağlanması amacı ile oluşturulmuştur. Bu format işemine en gereksinme duyan nesne sınıfı Date nesnesi olabilir. Henüz sadece Array, Number ve Date nesneleri, toString() metodundan farklı bir toString() metodu içeriği sunabilmektedirler.

Yerel formatlar herkesin özel terciihine göre de değişebileceğinden, kullanıcılar kendi özel tercihleri olan toLocaleString() metotlarını yazarak istedikleri nesne sınıfının toLocaleString() metoduna bindirebilirler.

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

Generik Nesne Prototipinin valueOf() metodunun kullanım şekli aşağıdaki gibidir :

this.valueOf();
		

Gerek this değeri, gerekse valueOf() fonksiyonun içeriği hakkında aynı toString() metodundaki bilgiler geçerlidir. JavaScript yorumlayıcısı, this değerinin [[Class]] özelliğine uygun bir valueOf() metodu içeriği bulacak ve işlemi gerçekleştirecektir.

Generik Nesne Prototipinin valueOf() metodu, çağrıyı yapan this değerini döndürür. Doğal olarak bu içeriği ile fazla yararlı değildir. Bu metodun belirgin bir ilkel değer karşılığı olmayan bir generik nesne sınıfı örneğine uygulanmasını içeren JavaScript programı ve bağlı olduğu uygulama sayfasında verdiği sonuç aşağıda görülmektedir.

...

a = {r : 13, t : 67};

sonuçVeTipYaz('a.valueOf() = ', a.valueOf(), 'b4.2.4-uyg-1-sonuç-1');

...
		

Program Sonucu :

Bu sonuç metodun boş ve belirgin bir ilkel değer karşılığı olmayan generik nesne sınıfı örneklerine uygulanmasının bir yararı olmadığını belirtmektedir.

Generik nesne örneklerinin valueOf() metodunun uygulanması ile bir değer hesaplanamamasının nedeni, generik nesne örneklerinin yapısının son derece esnek ve belirli bir modeli olmamasından kaynaklanmaktadır. Generik nesne örneklerinin yapıları, kullanıcılar tarafından yapılan ve bir sınırı olmayan özellik katkıları ile oluşmaktadır. Generik nesne örnekleri çeşitli büyüklüklerin bir araya toplanması ile oluşmuşlardır ve çoğunlukla belirli bir ilkel değer karşılıkları yoktur. Zaten, eğer generik nesne sınıfı örneklerinin belirli bir değer karşılığı olması istenseydi, nesne örnekleri Number gibi daha spesifik nesne sınıflarından oluşturulurdu. Doğal olarak, herşey generik sınıf nesne örneğinin özelliklerine bağlıdır. Generik nesnelerin yukarıdaki örnekte olduğu gibi, ilkel değer karşılıklarının bulunamaması halinde , generik nesne prototipinin valueOf() metodu, sadece nesneyi döndürmektedir. Yoksa, nesne örneğinin içsel [[Value]] özelliğinin değeri döndürülür. Bu metodun belirgin bir ilkel değer karşılığı olan bir generik nesne sınıfı örneğine uygulanmasını içeren JavaScript programı ve bağlı olduğu uygulama sayfasında verdiği sonuç aşağıda görülmektedir.

...
a = new Object('Proje Lokasyonu');

sonuçveTipYaz('a.valueOf() = ', a.valueOf(), 'b4.2.4-uyg-2-sonuç-1');
...
		

Program Sonucu :

Alınan sonuçtan görüldüğü gibi, generik nesne sınıfının valueOf() metodu, bir ilkel değer karşılığı olan generik nesne sınıfı örneklerine uygulandığında, nesne örneğinin ilkel değer değer karşılığı olan ilkel değeri, o ilkel değere en uygun olan veri tipinde geri döndürmektedir.

ECMA-262 standardında, birçok öntanımlı nesne sınıfı prototipinde, kendilerine daha uygun içerikleri olan valueOf() metotlarının kendi sınıflarının prototipine kalıtımla aktarılmış generik nesne sınıfının valueOf() metoduna bindirilmiş olduğu görülmektedir. İlgili sınıflar incelenirken, valueOf() metodunun o sınıfın prototipindeki bindirilmiş içeriği de incelenecektir.

Valid XHTML 1.1