JavaScript:闭包中的自动getter和setter而不使用eval?

JavaScript:闭包中的自动getter和setter而不使用eval?,javascript,closures,Javascript,Closures,注意:关于JavaScript中的getter和setter有很多问题(请参见、等)。这些问题大多涉及对象,少数涉及闭包,而很少涉及自动生成getter和set。这个问题涉及后者 to可能是最适合我所寻找的,但对于我的用例来说并不理想 目前,在我的结语中,我有以下几点: function myClosure() { var closureVar1, closureVar2 function do () { ... } function setupSettersAndGetters

注意:关于JavaScript中的getter和setter有很多问题(请参见、等)。这些问题大多涉及
对象
,少数涉及
闭包
,而很少涉及自动生成getter和set。这个问题涉及后者

to可能是最适合我所寻找的,但对于我的用例来说并不理想

目前,在我的结语中,我有以下几点:

function myClosure() {
  var closureVar1, closureVar2

  function do () { ... }

  function setupSettersAndGetters() {

    var closureVariables = ['closureVar1', 'closureVar2']

    for (var i = 0; i < closuredVariables.length; i++) {

      var currentClosureVariable = closureVariable[i]
      var toEvaluateString = "                                                 \
      do." + currentClosureVariable + " = function(value){                     \
        if(!arguments.length) return " + currentClosureVariable + ";           \
        " + currentClosureVariable + " = value;                                \
        return setup;                                                          \
      };                                                                       \
      "
      eval(toEvaluateString)
    }
  }
  setupSettersAndGetters()
  return do;
}
使用
eval
只存在一个“小”问题,有些人对此很感兴趣

所以我的问题是,有没有更好的方法来处理这个问题,允许我按名称调用setter/getter,而不是使用字符串

e、 g.我可以使用中间函数,例如:

test.sget('closureVar1', 10) // set closureVar1 to 10
test.sget('closureVar2') // get closureVar2
但即使这样做,我认为我仍然需要使用
eval
?我更喜欢调用变量的名称


想法?

您可以接受传递给
myClosure
函数的参数

var args = Array.prototype.slice.call(arguments);
。。。并使用它们设置您的setter和getter:

args.forEach(function(arg) {
    instance[arg] = function(d) {
        if (!arguments.length) return arg;
        arg = d;
        return instance;
    };
});
这样,您可以传递所需的变量数量,也可以避免
eval

下面是一个演示:

函数myClosure(){
var实例={};
var args=Array.prototype.slice.call(参数);
args.forEach(函数(arg){
实例[arg]=函数(d){
如果(!arguments.length)返回arg;
arg=d;
返回实例;
};
})
返回实例;
};
var测试=myClosure(“v1”、“v2”、“v3”)
test.v1(16).v2(2).v3(8)

console.log(test.v1()+test.v2()+test.v3())
Look-in.@Xufox可以,看起来很有用,但是理解js文档对我来说一直是一个挑战。。。我基本上是通过w3schools学习JS的(w3schools几乎没有提供JS的技术细节),并通过摆弄d3学习JS。因此,如果你也知道一个地方可以很好地了解如何正确地使用JS,那也会很感激。好的,我会指给你看的就是同一个文档页面MDN。@Xufox好的,我会花更多的时间在MDN文档上:)@sumneuro不用担心。这正是我的观点:其他用户可以在现有答案的基础上进行改进,添加一些功能。如果您想尝试一下,后续问题也会出现
args.forEach(function(arg) {
    instance[arg] = function(d) {
        if (!arguments.length) return arg;
        arg = d;
        return instance;
    };
});