如何在不使用原型的情况下链接函数
How to chain functions without using prototype?
我一生中收集了一堆有用的函数。
function one(num){
return num+1;
}
function two(num){
return num+2;
}
我可以用two(two(one(5)))
打电话给他们
但我更愿意使用(5).one().two().two()
如何在不使用原型的情况下实现这一点?
我试图看看下划线链是如何工作的,但他们的代码太密集了,无法理解它
点语法是为对象保留的。所以你可以做一些类似的事情
function MyNumber(n) {
var internal = Number(n);
this.one = function() {
internal += 1;
// here comes the magic that allows chaining:
return this;
}
// this.two analogous
this.valueOf = function() {
return internal;
}
}
new MyNumber(5).one().two().two().valueOf(); // 10
或者,您将在本机 Number 对象/函数的原型上实现这些方法。这将允许(5).one()...
为了避免
像@Bergi的解决方案那样在链的末端调用toValue
,您可以使用带有附加方法的函数。当尝试将其转换为基元类型时,JS将自动调用toValue
。
function MyNumber(n) {
function x () { }
x.one = function() { n++; return this; };
x.valueOf = function() { return n; };
return x;
}
然后
MyNumber(5).one().one()
> 7
一个不错的通用替代方案是创建自定义函数组合函数
var go = function(x, fs){
for(var i=0; i < fs.length; i++){
x = fs[i](x);
}
return x;
}
你可以这样称呼它:
go(5, [one, two, two])
我个人不太喜欢方法链接,因为它将您限制为一组预定义的函数,并且"链接对象"内部的值与外部的自由值之间存在阻抗不匹配。
另一种选择是使用 lodash 流函数。例如:
var five = _.flow(one, two, two)
five(5)
我更喜欢为变量分配一个新链。它给它一个明确的名字,并鼓励重复使用。
顺便说一句,lodash 还有助于将额外的参数传递给链的函数。例如:
var addFive = _.flow(
_.partialRight(_.add, 1),
_.partialRight(_.add, 2),
_.partialRight(_.add, 2)
)
还有许多其他有用的函数可以帮助功能链,例如,部分、扩散、翻转、否定等。
基本上JS中没有函数组合。即使有,也会与你在问题中提到的顺序相反。即two . two . one
因为数学声明了这样的组合运算符。所需的顺序称为管道。
话虽如此,如果你真的想要用点运算符进行组合,你仍然可以通过Proxy
对象重载.
运算符来实现。这是一个有点复杂的话题,您可以查看这篇不错的博客文章以获取一些想法。
但是,满足您需求的最简单方法是将函数数组减少为;
var pipe = (fs,x,y) => fs.reduce((r,f) => f(r),{x,y}),
fs = [ ({x,y}) => ( x++
, y++
, {x,y}
)
, ({x,y}) => ( x*=3
, y*=3
,{x,y}
)
, ({x,y}) => ( x--
, y--
, {x,y}
)
];
var {x,y} = pipe(fs,1,2);
console.log(x,y);
相关文章:
- 在什么情况下需要同时使用compile&链接函数的角度
- Webscratching自动化如何在没有链接TAG的情况下模拟点击HREF链接
- 如何在不呈现页面的情况下点击链接
- 当按下链接以在不同页面上的表单中的下拉列表中设置值时
- 如何在不链接/jquery的情况下使用方法应用css属性数组
- 为什么在这种情况下要向JQuery添加两个链接
- 如何使html链接标签可以在没有标签的情况下工作
- 如何在没有onClick的情况下使用Javascript链接
- 在没有 jquery 的情况下更改子节点(父节点具有 ID)中的链接文本
- 在不增加分析跳出率的情况下,绑定网页上的内部链接以动态加载
- 如何在我的情况下切换链接
- 在不触发弹出过滤器的情况下打开数组中的链接
- 在没有服务器端脚本的情况下跨多个页面链接导航栏
- Javascript:如何在不复制但链接的情况下将另一个对象 B 的方法混合到我的对象 A
- 如何在不重新加载页面的情况下在醉酒的工具提示中创建自关闭链接
- 如何在没有Jquery的情况下在Javascript中链接
- 如何在没有图像的情况下获取链接
- 在没有回调的情况下链接多个jquery事件
- 如何在不使用原型的情况下链接函数
- 如何在没有选项卡的情况下链接到Titanium Mobile中的页面/窗口