一个可以在Javascript中组合和链接(点表示法)的函数

前端之家收集整理的这篇文章主要介绍了一个可以在Javascript中组合和链接(点表示法)的函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试转换使用大量点符号链接的旧api,这需要保留,即:

  1. [1,2,3,4].newSlice(1,2).add(1) // [3]

我想在这个示例Ramda中添加组合的功能样式,但lodash或其他人会没问题:

  1. const sliceAddOne = R.compose(add(1),newSlice(1,2))
  2. sliceAddOne([1,4])// [3]

我的问题是如何在我的函数newSlice中进行链接和组合这个函数的样子是什么?

我有一个小小的jsBin例子.

最佳答案
编辑

我想我最初误解了你.你想要一个你可以称之为的函数f

  1. f(...args)(someObj) === someObj.f(...args)

我会那样做的

  1. // infix
  2. Array.prototype.newSlice = function(x,y) { return this.slice(x,y) }
  3. // prefix
  4. const newSlice = (x,y) => F => F.newSlice(x,y)

这是一个很好的设计,因为您可以在任何希望具有newSlice功能的Object上实现newSlice,并且前缀功能将起作用.这也允许你在每个对象类型(Array,String,Other …)上拥有newSlice的唯一实现,因为我们正在切片的底层数据可能会有所不同 – 你可以得到所有这些而不必做傻条件这会在你的功能体内进行检查.

  1. // newSlice :: [a] -> (Integer,Integer) -> [a]
  2. Array.prototype.newSlice = function(x,y) {
  3. return this.slice(x,y)
  4. }
  5. // newSlice :: String -> (Integer,Integer) -> String
  6. String.prototype.newSlice = function(x,y) {
  7. return this.substring(x,y)
  8. }
  9. // even on a custom object
  10. class LottoTicket {
  11. constructor(...nums) { this.nums = nums }
  12. newSlice(x,y) { return this.nums.slice(x,y) }
  13. }
  14. // newSlice :: (Array,String) a => (Integer,Integer) -> a -> a
  15. const newSlice = (x,y)
  16. // use it in prefix position
  17. console.log(newSlice(1,2)([1,4])) // [2]
  18. console.log(newSlice(1,2)("abcd")) // 'b'
  19. console.log(newSlice(1,2)(new LottoTicket(9,8,7))) // [8]
  20. // use it infix position
  21. console.log([1,2)) // [2]
  22. console.log("abcd".newSlice(1,2)) // 'b'
  23. console.log((new LottoTicket(9,7)).newSlice(1,2)) // [8]

猜你在找的JavaScript相关文章