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