JavaScript Private Değişkenler
JavaScript OOP veya Nesne Yönelimli Programlama ile geliştirme yaparken private değişken oluşturma ve kullanımı ile ilgili bilgiler yer alıyor.
JavaScript ile Nesne Yönelimli olarak kod yazarken çeşitli zorluklarla karşılaşılır.
Bu zorluklardan birisi de Private değişkenlerdir.
Private değişkenler sadece tanımlı olan nesneyi ilgilendiren değişkendir diyebiliriz.
Private değişkenlere nesne dışından erişim ve değerinin değiştirilmesi dolaylı olarak yapılır.
Peki private değişkenlere neden ihtayaç duyulur.
Metot içerisindeki hesaplamanın doğru olması için bazı değerler Private değişken olarak tutulur.
Böylece nesne dışından müdahaleye kapalı ve güvenli bir hesaplama yapılmış olur.
JavaScript Private değişken tanımlama
Alt çizgi notasyonu
JavaScript’te private değişken için özel bir tanım yoktur.
JavaScript geliştiricileri ortak olarak alt çizgi ile başlayan değişkenleri private değişken olarak kabul eder.
<script>
"use strict";
function Nokta(x, y) {
this._x = x; // _x private değişken
this._y = y; // _y private değişken
this.getX = function() { return this._x; }; // dolaylı erişim
this.setX = function(x) { this._x = x; }; // dolaylı değer değiştirme
this.getY = function() { return this._y; }; // dolaylı erişim
this.setY = function(y) { this._y = y; }; // dolaylı değer değiştirme
}
var xNokta = new Nokta(0, 0);
xNokta.setX(10);
console.log(xNokta.getX());
xNokta.setY(20);
console.log(xNokta.getY());
console.log(xNokta._x); // 10
console.log(xNokta._y); // 20
</script>
Ancak bu yöntem pek güvenilir değildir.
Tam olarak Private değişken tanımına uymamaktadır.
Dışarıdan müdahale edilebilir.
Kapsam alanı / Closure
JavaScript global ve lokal olmak üzere iki değişken kapsam alanı vardır.
Fonksiyon içerisinde tanımlanan değişkenler lokal değişkenlerdir ve dışarıdan değişkene erişmek ve değerini değiştirmek dolaylı olarak yapılabilir.
<script>
"use strict";
function Nokta(x, y) {
var _x = x; // _x private değişken
var _y = y; // _y private değişken
this.getX = function() { return _x; }; // dolaylı erişim
this.setX = function(x) { _x = x; }; // dolaylı değer değiştirme
this.getY = function() { return _y; }; // dolaylı erişim
this.setY = function(y) { _y = y; }; // dolaylı değer değiştirme
}
var xNokta = new Nokta(0, 0);
xNokta.setX(10);
console.log(xNokta.getX());
xNokta.setY(20);
console.log(xNokta.getY());
console.log(xNokta._x); // undefined
console.log(xNokta._y); // undefined
</script>
Böyle bir yöntem var peki neden alt çizgi notasyonu kullanılıyor.
JavaScript Nesne Prototipi yazımda JavaScript fonksiyonlarının da nesne olarak tanımlandığı ve kurucu içerisindeki tanımlanan fonksiyonların bir kopyasının belleğe kopyalandığını söylemiştim.
Yukardaki gibi dolaylı erişimi kullanımı birden fazla değişken için yapılırsa gereğinden fazla bellek kullanacaktır.
Bundan dolayı JavaScript ile Nesne Yönelimli Programlama yaparken fonksiyonları prototype özelliği içerisine yazarız.
Module pattern / Modül deseni
Bu yöntem diğerlerine göre biraz daha karışık ancak çoğu JavaScript framework’ü tarafından kullanılan bir yöntemdir.
<script>
"use strict";
var Nokta = (function() {
var Nokta, _x = 0, _y = 0; // Private değişkenler
Nokta = function(x, y) { // Private fonksiyon
_x = x;
_y = y;
};
Nokta.prototype = {
constructor: Nokta,
setX: function(x) {
_x = x;
},
getX: function() {
return _x;
},
setY: function(y) {
_y = y;
},
getY: function() {
return _y;
}
}
return Nokta; // Private kurucuyu dolaylı olarak geri döndür
})();
var aNokta = new Nokta(0, 0);
aNokta.setX(20);
console.log(aNokta.getX());
aNokta.setY(10);
console.log(aNokta.getY());
console.log(aNokta._x); // undefined
console.log(aNokta._y); // undefined
var bNokta = new Nokta(50, 50);
console.log(bNokta.getX());
console.log(bNokta.getY());
console.log(bNokta._x); // undefined
console.log(bNokta._y); // undefined
</script>
Örnekte Nokta değişkeni içerisinde private değişken ve fonksiyon tanımlıyoruz.
Değişken içerisindeki private fonksiyonu dolaylı olarak geri döndürüyoruz.
Böylece dolaylı bir şekilde private değişken ve fonksiyon tanımı yapmış oluyoruz.
JavaScript Derslerine buradan ulaşabilirsiniz…
Hayırlı günler dilerim.