Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 专用属性的常规setter/getter方法_Javascript_Design Patterns - Fatal编程技术网

Javascript 专用属性的常规setter/getter方法

Javascript 专用属性的常规setter/getter方法,javascript,design-patterns,Javascript,Design Patterns,我可以在JavaScript类上创建私有成员,如下所示: function Class(_foo, _bar) { var foo = _foo, // private, yay bar = _bar; // also private, also yay } 如何为这个类实现通用的setter/getter方法?我想一种方法是使用eval: function Class(_foo, _bar) { var foo = _foo, bar = _b

我可以在JavaScript类上创建私有成员,如下所示:

function Class(_foo, _bar) {
    var foo = _foo, // private, yay
        bar = _bar; // also private, also yay
}
如何为这个类实现通用的setter/getter方法?我想一种方法是使用
eval

function Class(_foo, _bar) {
    var foo = _foo,
        bar = _bar;

    this.get = function(property) {
        return eval(property);
    };

    this.set = function(property, value) {
        eval(property + " = " + value);
    };
}
然而,这个解决方案是丑陋的。另一种方法是创建一个
private
对象,然后访问该对象的属性:

function Class(foo, bar) {
    var private = {
        foo: foo,
        bar: bar 
    };

    this.get = function(property) {
        return private[property];
    };

    this.set = function(property, value) {
        private[property] = value;
    };
}
不过,我也不太喜欢这个解决方案,因为它意味着我必须到处访问
private
对象。当然有更干净的方法为JavaScript类上的私有属性提供通用的getter/setter吗

我知道已经有人问过类似的问题,但似乎没有人问过这个特定的问题;也就是说,如何为类上的所有私有属性提供一个getter/setter


这里有两个例子。

我认为你们应该看看ES5的能手和二传手。这些允许您创建看起来像属性的东西,但实际上调用它们后面的函数。例如:

var _a : 'nuthin',
var obj = {
  get a: function() { return this._a; },
  set a: function(a) { this._a = a; }
}

obj.a = 'sumpin';
console.log(obj.a); // nuthin
您也可以在构造函数中创建getter和setter,但语法比较繁琐。像这样:

function nooObject(){
  var _a = 'nuthin';
  Object.defineProperties(this, {
    "a": { get: function () { return _a; } 
           set: function(a) { this._a = a; } }
  });
}

您可以使用
对象执行更多操作。定义属性
。请在

上阅读所有相关内容。您的第二个示例通常是如何完成的。没有可用于局部变量的“主”对象,因此您必须创建一个主对象,以便像属性一样访问局部变量。当然有人想知道为什么您有一个用于私有属性的公共
.get(propName)
方法。这难道不完全违背了拥有私有财产名称的初衷吗?当然,如果您只是将属性放在
this
对象上,这将很容易。@jfriend00每当我在这个类上设置属性时,我想调用一个特定的函数;似乎最好的方法是创建一个
set
函数,该函数可以更改属性并调用该函数。当然,我不希望能够手动更改属性,因此需要使用私有变量。因此
.get(propName)
。(我不认为观察器得到了很好的支持,如果有的话)除了让JS更像Java之外,创建这些getter/setter还有什么意义?您所展示的实现并没有真正隐藏任何信息,因为所有变量都是通过getter和setter直接访问的。这是Java中经常使用的方式,但不是JavaScript方式。@AndrewEisenberg请看我上面的评论。我想您应该使用ES5 getter和setter。请看下面的答案……我知道能手和二传手;然而,我不确定他们得到了多大的支持。如果我想支持IE9+和所有其他几个版本的现代浏览器,它们使用起来安全吗?值得一提的是,大多数人可能会觉得这项功能的缺陷是不可接受的(IE9+)。也许几年后吧。@rambocoder:那是我一直在寻找的参考资料,谢谢。我认为它对我的目的有足够的支持。哇!我不认为二传手和后传手至少还要再踢几年。这会很有趣。很高兴这对你有用。我经常忘记旧式浏览器,因为我处于(幸运的?)境地,在最新和最优秀的浏览器上为开发人员编写开发工具。