Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
私有属性的Javascript动态getter/setter_Javascript_Dynamic_Private_Getter Setter_Prototype Programming - Fatal编程技术网

私有属性的Javascript动态getter/setter

私有属性的Javascript动态getter/setter,javascript,dynamic,private,getter-setter,prototype-programming,Javascript,Dynamic,Private,Getter Setter,Prototype Programming,我想动态创建getter/setter方法来检索私有属性 这就是我所做的 首先,我上了一节课: function winClass (posX, posY, w, h) { var x = posX || 0; var y = posY || 0; var width = w || 0; var height = h || 0; } 然后,我使用getter/setter方法扩展winClass,如下所示: winClass.prototype.getX = function

我想动态创建getter/setter方法来检索私有属性

这就是我所做的

首先,我上了一节课:

function winClass (posX, posY, w, h) {
  var x = posX || 0;
  var y = posY || 0;
  var width = w || 0;
  var height = h || 0;
}
然后,我使用getter/setter方法扩展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范围内,但我不知道如何为私有变量动态设置getter/setter方法


有什么想法吗?

getter/setter必须位于可以看到私有变量的范围内,并且唯一可以看到这些变量的范围是构造函数的内部。这就是为什么这些变量实际上是私有的。因此,要为它们生成setter/getter,必须将函数放在可以看到它们的范围内。这将有助于:

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
您可以看到它在这里工作:

如果您想要一个通用的私人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
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;
}
而且,如果你想绕过这些变量的私有性质,这对我来说毫无意义(因为你也可以把它们变成标准的实例变量),你可以这样做:

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;
}
这里的示例:

当然,这会破坏变量的私有性,因此这样做没有任何意义,因为使它们成为常规实例变量会更容易,并且具有相同的访问控制

为了完整起见,这里有一个普通的实例变量方法,它允许您自由地向原型添加访问器方法,但变量不是私有的

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

因此,在Javascript中,
prototype
的概念是试图假装它是面向对象的,但这是getter/setter的静态声明,而不是动态声明。我需要动态地将它们添加到winClass中。正如我已经说过的,这些是私有变量,您可以访问它们的唯一方法是从构造函数中访问它们。任何允许您从构造函数外部访问它们的方法都会破坏它们的私有性,您也可以将它们变成普通的实例变量,而不是私有变量。选择所需的特征,然后使用该类型的变量。私密就是私密。你可以绕过它,但它们不再是私人的。我将在private中再添加一个hack,但实际上没有意义,因为它们应该是实例变量。@Ed Heal-您需要给原型继承更多的信任。Javascript的原型概念并非来自,而且(除了语法之外)一点也不是捏造的。@EdHeal(今天偶然发现:)它既不是捏造的,也不是假装的,只是不像你习惯的那样(或者不是一百万年前)。以自我为中心;它也是一种原型OOP语言。没有什么非面向对象的东西。看看它,它解释了如何用JavaScript编写C风格的getter和setter。很酷