Javascript динамически получает / устанавливает для частных свойств - PullRequest
5 голосов
/ 29 августа 2011

Я хочу создать методы получения / установки для извлечения личных свойств.

Это то, что я сделал.

Прежде всего, я создал класс:

function winClass (posX, posY, w, h) {
  var x = posX || 0;
  var y = posY || 0;
  var width = w || 0;
  var height = h || 0;
}

Затем я расширил winClass с помощью методов получения / установки, как показано ниже:

winClass.prototype.getX = function () {
  return x;
}

winClass.prototype.setX = function (val) {
  x = val;
}

И затем я проверил:

var win1 = new winClass (10, 10, 100, 100);
document.write (win1.getX ());

Но при попытке установитьМетод getX: x не определен.Это имеет смысл, потому что «x» не входит в область видимости winClass, но, таким образом, я не знаю, как динамически настраивать методы получения / установки для частных переменных.

Есть идеи?

1 Ответ

13 голосов
/ 29 августа 2011

Получатель / установщик должны находиться в области видимости, которая может видеть закрытые переменные, и единственная область видимости, которая может видеть эти переменные, - это внутренняя часть конструктора.Вот почему эти переменные на самом деле являются частными.Итак, чтобы сделать для них сеттеры / геттеры, вы должны поместить функции в ту область, в которой они могут их видеть.Это будет работать:

function winClass (posX, posY, w, h) {
  var x = posX || 0;
  var y = posY || 0;
  var width = w || 0;
  var height = h || 0;

  this.getX = function() {return(x);}
  this.setX = function(newX) {x = newX;}
}

var win1 = new winClass (10, 10, 100, 100);
alert(win1.getX());   // alerts 10

Вы можете увидеть, как это работает здесь: http://jsfiddle.net/jfriend00/hYps2/.

Если вам нужен универсальный метод получения / установки для рядовых, вы можете сделать это следующим образом:

function winClass (posX, posY, w, h) {
  var privates = {};
  privates.x = posX || 0;
  privates.y = posY || 0;
  privates.width = w || 0;
  privates.height = h || 0;

  this.get = function(item) {return(privates[item]);}
  this.set = function(item, val) {privates[item] = val;}
}

var win2 = new winClass(10,10,100,100);
alert(win2.get("x"));    // alerts 10

И, если вы хотите взломать закрытую природу этих переменных, которая не имеет смысла для меня (как вы могли бы тогда сделать их стандартными переменными экземпляра), вы можете сделать это следующим образом:

function winClass (posX, posY, w, h) {
  var privates = {};
  privates.x = posX || 0;
  privates.y = posY || 0;
  privates.width = w || 0;
  privates.height = h || 0;

  this.getPrivates = function() {return(privates);}
}

winClass.prototype.getX = function() {
    return(this.getPrivates().x);
}

winClass.prototype.setX = function(newX) {
    this.getPrivates().x = newX;
}

Пример здесь: http://jsfiddle.net/jfriend00/EKHFh/.

Конечно, это разрушает частную природу переменных, поэтому на самом деле нет никакого смысла делать это таким образом, поскольку делать их обычными переменными экземпляра будетпроще и имеют тот же контроль доступа.

И, для полноты, вот обычный метод переменных экземпляра, который позволяет свободно добавлять методы доступа в прототип, но переменные не являются частными.

function winClass (posX, posY, w, h) {
  this.x = posX || 0;
  this.y = posY || 0;
  this.width = w || 0;
  this.height = h || 0;
}

winClass.prototype.getX = function() {
    return(this.x);
}

winClass.prototype.setX = function(newX) {
    this.x = newX;
}
...