学过js的都知道原型是js的灵魂,我刚接触原型的时候觉得还挺绕的,然后看了一系列的解释然后自己理了一下思路,总算是清晰了,今天我弄了一下柯里化和反柯里化,对反柯里化结合原型链有了一定的认识,一下是我所总结的。
反柯里化,个人解释就是通过添加对象或者函数的原型的方法,让原本使用范围具有局限性的一段代码能够适用范围更广,例如,数组的reduce,map,foreach这些函数都只能通过数组对象使用,如果字符串要使用其方法,必须通过call,bind,apply的方式去修改函数的调用主体,但是我们完全可以自己封装然后添加到函数的原型对象中,这样任何类型使用数组的方法都能直接调用,具体实现方法如下:
Function.prototype.uncurrying = function(){ const self = this return function () { let obj = [].shift.call(arguments) let rest = arguments return self.apply(obj, rest) } }
上面的代码很简单,先在Function里面添加一个原型方法,返回一个函数,this是我们后面要写的实例对象,obj指的是调用主体,在这里我们将接受的主体全部修改成了数组类型(无论哪种类型变成了数组类型就能使用数组的方法了),rest指的是传入的剩余参数,然后以obj为主体调用实例对象传入剩余参数作为返回,得到了一个可以作用在其他主体上的函数。
下面我们以foreach举例实例化函数:
1 let forEach = [].forEach.uncurrying() 2 3 forEach("asd", function (item) { 4 console.log(item) 5 })
第一行forEach原型上有了一个uncurrying的方法,且执行了其函数
最后结果为 a s d
不仅仅是forEach,我们如果用reduce,fifter一样的:
1 let reduce = [].reduce.uncurrying() 2 let filter = [].filter.uncurrying() 3 let ans = reduce("123", (a, b) => { 4 return a*1+b*1 5 }, 0) // 6
总结:反柯里化如果用的好能够自己封装很多局限性的函数,其思想很优秀
原文地址:https://www.cnblogs.com/388ximengpy/p/12054419.html
时间: 2024-10-13 22:17:10