我正在创建一个 JavaScript 库。我一直在尝试实现链接。
0:我首先想到的是:
function V(p) {
return {
add : function(addend) { return V(p + addend); },
sub : function(subtra) { return V(p - subtra); },
};
}
使用这种方法,我可以轻松链接:
V(3).add(7).sub(5) // V(5)
不幸的是,结果总是一个包装的 V() 函数,我无法以这种方式提取结果值。所以我想了一下这个问题,想出了两个半解决方案。
1:将标志传递给最后一个方法
function V(p, flag) {
if(flag)
return p;
else
return {
add : function(addend, flag) { return V(p + addend, flag); },
sub : function(subtra, flag) { return V(p - subtra, flag); }
};
}
使用此方法,我可以通过将标志传递给我使用的最后一个方法来结束链:
V(3).add(7).sub(5, true) // 5
虽然这工作得很好,但它需要一些代码重复,并使链接的可读性降低,我的代码也不太优雅。
2:使用 start() 和 end() 方法
_chain = false;
function V(p) {
function Wrap(w) {
return (_chain) ? V(w) : w;
}
return {
add : function(addend) { return Wrap(p + addend); },
sub : function(subtra) { return Wrap(p - subtra); },
start : function() { _chain = true; },
end : function() { _chain = false; return p; }
};
}
使用此方法,您无需更多代码即可执行单个操作:
V(3).add(7) // 10
但是链接需要另外两种方法,这使得事情的可读性大大降低:
V(3).start().add(7).sub(5).end() // 5
所以基本上我只是在寻找在我的库中实现链接的最佳方法。理想情况下,我正在寻找可以使用任意数量的方法并且不需要以不雅的方式终止链的东西。
V(3).add(7).sub(5) // 5, perfect chaining