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