JavaScript Temelleri

Bölüm 15

Kullanıcı Tanımlı Nesneler

Bölüm 15 Sayfa 6

15.5 - Genel, Özel ve Ayrıcalıklı Üyeler

Bir nesne sınıfının özellilerine bazen sınıf üyeleri adı da verilir. Üç türlü sınıf üyesi ayırdedilebilir. Bunlar genel, özel ve ayrıcalıklı üyelerdir.

5.5.1 - Genel Üyeler

Genel üyeler kamuya açık (public) olarak nitelendirilirler. Bir üyenin genel olabilmesi için salt prototipe eklenmiş ve yapılandırıcı fonksiyonda tanımlanmamış olması gerekir.Genel üyelere nesne yapılandırıcı fonksiyonu içinden veya dışından tüm program öğeleri erişebilirler. Genel bir üyenin değeri bir fonksiyonsa, buna genel metot adı verilir. Örnek:

function hipotenüs(a, b) {
			return Math.pow(a, 2) + Math.pow(b, 2);
}
üçgen.prototype.hipotenüs;
		

15.5.2 - Özel Üyeler

Bir nesne sınıfıının özel üyeleri (private members), yapılandırıcı fonksiyonun yerel değişkenleri ve parametreleridir. Örnek olarak,

function NesneSınıfı(parametre) {
var _özelÜye = 25;
this.genelÜye = parametre;
var that = this;
}
		

Yukarıdaki örnekte _özelÜye, parametre ve that, yapılandırıcı fonksiyonun yerel değişkenleri, yani nesne sınıfının özel üyeleridir. Parametrler ve that dışında kalan özel üyelerin tanıtıcıları konvansiyonel olarak bir alt bağlaç (underscore) ile başlatılır. Özel üyelere genel metotlar erişemez. Bir kabul (konvansiyon) olarak, that özel üyesine this saklı sözcüğü atanır ve bu da that değişkenini, genel metotlar için erişilebilir kılar.

Özel üyelere genel metotlar erişemez, sadece özel metotlar adı verilen, yapılandırıcı fonksiyonun iç fonksiyonları erişebilir. Dış fonksiyon görevini tamamlayıp program belleğini terketmiş olmasına karşın, hala bellekte yaşamını sürdüren yerel değişkenlere erişim yapan iç fonksiyonların olduğu sistemlere, kapalı devreler denildiğini biliyoruz. Kapalı devreler, bölüm 2.5.4 de ayrıntılı olarak incelenmiştir. Özel metotlar, kapalı devre konumundadır. Özel bir metot örneği aşağıda görülmektedir:

function NesneSınıfı(parametre) {
var _özelÜye = 25;
this.genelÜye = parametre;
var that = this;
function değerDeğiştir() {
_özelÜye += 1;
}
}
		

Özel metotlar, genel metotlar tarafından çağrılamaz. Bu metotların işe yarar olabilmeleri için bunları çağırabilen ayrıcalıklı metotların yaratılması gerekir.

15.5.3 - Ayrıcalıklı Üyeler

Ayrıcalıklı (privileged) üyeler, yapılandırıcı fonksiyon içinde this tanımı ile tanıtılmış özelliklerdir. Bu özelliklerin değeri bir fonksiyonsa, buna ayrıcalıklı metot adı verilir.

Ayrıcalıklı metotlar, genel metot olarak işlev görebildikten başka, özel üyelere de erişebilirler. Bu konuda örnek bir JavaScript programı ve bağlantılı olduğu uygulama sayfasında verdiği sonuç, aşağıda görülmektedir:

...
function Yanıtla(parametre) {
function çağrı() {
if (_gizli > 0) {
_gizli -= 1;
return true;
}
else {
return false;
}
}

var _gizli = 2;
this.genelÜye = parametre;
var that = this;
this.servis = function() {
if (çağrı ()) {
return that.genelÜye;
}
else {
return null;
}
};
}

var benimYanıtım = new Yanıtla(35); 
sonuçYaz('Yanıt = ', benimYanıtım.servis(), 'b15.5.3-uyg-1-sonuç-1');
...
		

Program Sonucu :

Yukarıdaki uygulamada _gizli ve parametre, özel üyeler, çağırma() özel bir metot, servis() ise, ayrıcaklı bir metottur. Yanıtla() nesne sınıfının herhangibir örneği 2 den fazla çağrılırsa, geriye null değeri döndürecektir. Ayrıcalıklı servis() metodu, özel çağrı() fonksiyonuna erişerek bu fonksiyonun, kapalı devre halinde eriştiği dış gizli adlı özel değişkenin değerini değiştirmesini sağlamaktadır. Ayrıcalıklı servis() metodu, genel özelliklere erişebilir, genel özellikler de ayrıcalıklı servis() metodunu kullanabilirler, fakat servis() metodu, doğrudan özel üyelere erişim sağlamaz.

Genel, özel ve ayrıcaklı üyeler terminolojisi ve yukarıdaki uygulamanın orijinal tasarımı, Yahoo çalışanı ve JavaScript uzmanı olan, Douglas Crocford tarafından tasarlanmıştır. Kendisi JavaScript üzerine yazdığı yorumlar, öğretim videoları ve ünlü fakat ne yazık ki türk alfabesindeki karakterlerin tümünü desteklemeyen, jslint programının da yazarıdır.

Özel üyelere erişebilen ayrıcalıklı metotların kapalı devre oluşturması, özellikle bu sınıfların çok sayıda örneklerinin üretileceği programlarda, fazla program belleği bloke edebileceği ve program performansını azaltacağı özellikle, Mike Koss tarafından öne sürülmüştür. Bu yazar, fazla bellek kullanımı eğiliminde olan bu uygulamaların, sınırlı bir kazanç sundukları bu nedenle vazgeçilemeyecek bir gereksinme olmadıkça ve özellikle veri yoğun uygulamalarda, aşırı şekilde kullanılmamasını sağlık vermektedir.

Valid XHTML 1.1