JavaScript Private Değişkenler

Paylaş

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.


Bunlarda ilgini çekebilir