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。
let fill = (_ => {}).call.bind([].fill)
fill([1, 2, 3], 0, 1, 2) // ?
Function.prototype
亦可使用 (_ => {})
arrow function 取代,而 Array.prototype
則以 []
取代。
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。
Conclusion
Function.prototype.call.bind()
雖然能將 method 轉成 function,唯 data 都在第一個 argument,不方便 function composition,因此實務上建議使用invoker()
Reference
MDN, Function.prototype.call()
MDN, Function.prototype.bind()
Ramda, invoker