私有属性的通用setter/getter方法

General setter/getter methods for private properties

本文关键字:setter getter 方法 属性      更新时间:2023-09-26

我可以像这样在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的两个例子。

我认为你应该看看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

上阅读所有相关内容