我正在創建一個JavaScript庫。我一直在試圖實施鏈接。在庫中實現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
我建議看看jQuery實施鏈接的方式。 – 2011-03-20 18:48:14
你會發現'underscore.js'實現你的第二個與[.chain](http://documentcloud.github.com/underscore/#chain) – Raynos 2011-03-20 18:55:31