码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2019-12-17 14:55:06      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:nbsp   his   bin   bind   reduce   OLE   sel   class   字符   

   学过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反柯里化个人理解以及操作

标签:nbsp   his   bin   bind   reduce   OLE   sel   class   字符   

原文地址:https://www.cnblogs.com/388ximengpy/p/12054419.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!