如何避免重复访问代码?

时间:2014-03-17 02:26:44

标签: javascript reflection d3.js introspection

以下是d3.js"可重复使用的图表API"的示例。 (从here复制粘贴):

function chart() {
  var width = 720, // default width
      height = 80; // default height

  function my() {
    // generate chart here, using `width` and `height`
  }

  my.width = function(value) {
    if (!arguments.length) return width;
    width = value;
    return my;
  };

  my.height = function(value) {
    if (!arguments.length) return height;
    height = value;
    return my;
  };

  return my;
}

请注意my.widthmy.height访问者的实体几乎完全相同。我想提出一种避免这种重复代码的方法。

以编程方式实现这些访问器的主要障碍是它们都直接在封闭的chart函数的范围内引用变量,并且我不知道如何以符号/间接的方式引用这些变量;没有按字面意思拼写出他们的名字,就是这样。 (为了清楚起见,在这种情况下,我所讨论的变量是在chart函数的前两行中声明的变量。)

我可以想办法解决这个问题,比如定义一些"命名空间"对象,像这样:

function chart () {
    var _ns = {'width': 720,
               'height': 80};

    ...
}

并在必要时使用widthheight替换对_ns['width']_ns['height']的引用。当然,区别在于我现在通过_ns[somevar]变量提供的符号引用来编写引用somevar的通用代码。例如。上面的重复访问器定义可以用所有变量名称上的单个迭代替换:

['width',
 'height',
 // and whatever else one may want to add later...
].forEach(function (varname) {
    my[varname] = function (value) {
        if (!arguments.length) return _ns[varname];
        _ns[varname] = value;
        return my;
    };
});

这种方法的一个缺点是由额外的间接级别引起的性能损失,即使在没有象征性地访问变量的情况下(例如在_ns['width']_ns.width等表达式中)

有没有办法将变量直接保留在chart函数的范围内,但以某种方式以符号方式访问它们? IOW,有没有类似内置"命名空间"可以在代码中扮演上述_ns对象部分的对象,需要以符号方式迭代所有变量,但不影响引用这些变量目录的能力? (我正在考虑类似于Python的locals()内置函数,它返回类似命名空间的对象。)

(当然,总是evil - 我的意思是 - eval,但我试图让代码保持正常运行。)

0 个答案:

没有答案