私有属性的常规setter / getter方法

时间:2014-05-18 15:55:07

标签: 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 = _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。

这是一个带有两个例子的jsFiddle

1 个答案:

答案 0 :(得分:7)

我认为你应该关注ES5 getter和setter。这些允许您创建看起来像属性的东西,但真正调用它们背后的函数。例如:

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

您可以使用Object.defineProperties执行更多操作。在MDN

上阅读所有相关内容