點燈坊

失くすものさえない今が強くなるチャンスよ

如何將 Method 轉成 Function ?

Sam Xiao's Avatar 2020-01-30

ECMAScript 所提供的多半以 prototype 的 Method 形式,可藉由本文手法將 Method 轉成 Function 使用。

Version

macOS Catalina 10.15.2
VS Code 1.41.1
Quokka 1.0.274
Ramda 0.26.1

call.bind()

let _fill = Array.prototype.fill
let fill = Function.prototype.call.bind(_fill)

fill([1, 2, 3], 0, 1, 2) // ?

Function.prototype.call() 可將 argument 傳給 function 執行,但此時 this 指向 function 為 undefined,需透過 bind()Array.prototype.slice 傳進產生新 function。

bind000

let fill = (_ => {}).call.bind([].fill)

fill([1, 2, 3], 0, 1, 2) // ?

Function.prototype 亦可使用 (_ => {}) arrow function 取代,而 Array.prototype 則以 [] 取代。

bind001

Ramda

import { invoker } from 'ramda'

let data = [1, 2, 3]

let fill = invoker(3)('fill')

fill(0)(1)(2)(data) // ?

Ramda 亦提供 invoker() 將 method 轉成 function,並將 data 改成最後一個 argument。

bind002

Conclusion

  • Function.prototype.call.bind() 雖然能將 method 轉成 function,唯 data 都在第一個 argument,不方便 function composition,因此實務上建議使用 invoker()

Reference

MDN, Function.prototype.call()
MDN, Function.prototype.bind()
Ramda, invoker