js反柯里化个人理解以及操作

Posted 388ximengpy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js反柯里化个人理解以及操作相关的知识,希望对你有一定的参考价值。

   学过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

总结:反柯里化如果用的好能够自己封装很多局限性的函数,其思想很优秀

以上是关于js反柯里化个人理解以及操作的主要内容,如果未能解决你的问题,请参考以下文章

js之柯里化与反柯里化

JS的防抖,节流,柯里化和反柯里化

柯里化与反柯里化

理解运用JS的闭包高阶函数柯里化

js - 理解函数柯里化

js - 理解函数柯里化