简体   繁体   English

私有属性的Javascript动态getter / setter

[英]Javascript dynamically getter/setter for private properties

I want to create getter/setter methods dyanmically to retrieve private properties. 我想动态地创建getter / setter方法来检索私有属性。

This is what I did. 这就是我做的。

First of all, I made the class: 首先,我上课了:

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

Then I extended winClass with getter/setter methods, as follows: 然后我用getter / setter方法扩展了winClass,如下所示:

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

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

And then I tested: 然后我测试了:

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

But the following error comes when I try to setup the 'getX' method: 'x is not defined'. 但是当我尝试设置'getX'方法时出现以下错误:'x未定义'。 It makes sense because that 'x' isn't in the winClass scope but thus I don't know how to setup dynamically getter/setter methods for private variables. 这是有道理的,因为'x'不在winClass范围内,但因此我不知道如何为私有变量设置动态getter / setter方法。

Any ideas? 有任何想法吗?

The getter/setters have to be in the scope that can see the private variables and the only scope that can see these variables is the internals of the constructor. getter / setter必须在可以看到私有变量的范围内,并且唯一可以看到这些变量的范围是构造函数的内部。 That's why these variables are actually private. 这就是为什么这些变量实际上是私有的。 So, to make setters/getters for them, you have to put the functions in that scope that can see them. 因此,要为它们制作setter / getter,您必须将函数放在可以看到它们的范围内。 This will work: 这将有效:

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

You can see it work here: http://jsfiddle.net/jfriend00/hYps2/ . 你可以在这里看到它的工作: http//jsfiddle.net/jfriend00/hYps2/

If you want a generic getter/setter for privates, you could do it like this: 如果你想要私有的通用getter / setter,你可以这样做:

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

And, if you want to hack around the private nature of these variables which makes no sense to me (as you might as well make them standard instance variables then), you can do it like this: 并且,如果你想破解这些变量的私有性,这对我来说没有意义(因为你可能会把它们变成标准的实例变量),你可以这样做:

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;
}

Example here: http://jsfiddle.net/jfriend00/EKHFh/ . 示例: http//jsfiddle.net/jfriend00/EKHFh/

Of course, this ruins the private nature of the variables so there isn't really any point in doing it this way as making them regular instance variables would be easier and have the same access control. 当然,这会破坏变量的私有性,因此实际上没有任何意义,因为使它们成为常规实例变量会更容易并具有相同的访问控制。

And, for completeness, here's the normal instance variable method that freely lets you add accessor methods to the prototype, but the variables aren't private. 并且,为了完整性,这里是正常的实例变量方法,它可以自由地为原型添加访问器方法,但变量不是私有的。

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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM