javascript - 有没有 Javascript depipe 方法?类似于绑定(bind)或调用,但用于取消管道原型(prototype)

标签 javascript node.js es6-class

是否有官方方法将管道函数的头作为普通函数参数传递?就像如何使用 .call 修改函数一样和.bind ,我想修改 String.prototype.includes 使其看起来像 includes('a')('acd') 。基本上,我想要一个使其第一个参数为“abc”的函数,即 String.prototype.includes('a') 中的 String 实例。

他是我最好的尝试...但这行不通,因为,为什么会这样 ['abc'].some(String.prototype.includes('b'))

基本上我想要一个很酷、令人困惑的版本 x => x.includes('b')

Javascript 中是否有一个版本的 call、bind 或 depipe 方法可以满足我的需要?

相关:What does "Function.call.bind(Function.bind)" mean?

最佳答案

没有内置方法可以执行此操作。忽略像 ramda/lodash.fp 这样允许您通过帮助器方法执行此操作的库 - 您将需要实现自己的帮助器。由于参数是“相反的”,你不能简单地进行 eta-reduce(避免额外的 lambda):

// all these functions exist in Ramda
function makeThisAnArgument(fn) { // uncurry this
  return (arg, ...args) => fn.call(arg, ...args)
}
function reverseArguments(fn) {
  return (...args) => fn.call(null, ...args.reverse());
}
// this would let you easily do:
const reversed = reverseArguments(makeThisAnArgument(String.prototype.includes))
const includesA = reversed.bind(null, 'a');
includesA('abc'); // true
includesA('bc'); // false

总的来说,请考虑查看有关 Ramda 的精彩讨论 Hey Underscore, You're doing it Wrong!这解释了启用可组合 API 所需的调用顺序、约定和方法签名,例如您所要求的 Ramda 公开的 API。

关于javascript - 有没有 Javascript depipe 方法?类似于绑定(bind)或调用,但用于取消管道原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67725634/

相关文章:

javascript - Jquery/PHP : passing JSON data with Ajax ends up truncated

JavaScript:向原型(prototype)方法添加命名空间

node.js - 哪个Node.js模板引擎在服务器端使用时性能最好?

javascript - 如何为 sessionStorage 编写合适的 ES6 包装器

javascript - ES6 : this within static method

angular - Typescript 如何从嵌套对象 Getter 返回类函数引用

javascript - 使用任意方法(插件、GreaseMonkey?)在 Chrome 或 Firefox 中使用 JavaScript 移动鼠标光标

javascript - 使用append()后JQuery不工作

node.js - 使 JWT 失效的成本、性能和陷阱

node.js - 使用命令提示符启动 ionic 时无法验证第一个证书