首页 文章

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

提问于
浏览
1

我可以在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 回答

  • 6

    我想你应该看看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; } }
      });
    }
    

    你可以用_820226做更多的事情 . 在MDN阅读所有相关内容

相关问题