在学习 D3.js 时,我看到了一篇解释其可重用代码单元背后的主要设计模式的博客文章。我已经复制了下面的相关代码。下面展示的模式正是它在 D3 代码库和插件中使用的方式(示例)。
我对这段代码的一个问题是它有太多的属性复制粘贴。JavaScript 作为一种函数式语言,我认为我可以将样板代码重构出来,但我想不出办法来做到这一点。arguments
andvalue
参数很容易传递给通用函数,但我找不到保留对width
andheight
属性的引用的方法。
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;
}
事实上,这就是它在实际 D3 代码库中的完成方式,这让我想知道是否可以进行重构,但我希望这只是一个不是高优先级问题的问题(并且新的贡献者正在这样做方式,因为这就是以前的做法)。
我正在寻找的基本上是将每个访问器的主体替换为:
my.height = function(value) {
return getSet(arguments, value, whatever);
};
调用仍有一些样板,但至少逻辑是集中的,如果需要,可以只在一个地方更新。