javascript - js 有優雅的辦法從外部 hijack 函數入參嗎?
黄舟
黄舟 2017-05-16 13:30:03
0
3
452
let fn = (a, b, c) => {
  console.log(a, b, c)
}

fn1(0, 0, 0) // output: 0 0 0

想要 fn 每次呼叫的時候第二個參數總是加 2

fn(0, 0, 0) // output: 0 2 0
fn(1, 1, 1) // output: 1 3 1

目前只找到一個很醜的寫法去 hijack:

fn = (_ => {
  const innerFn = fn
  const newFn = (a, b, c) => {
    innerFn(a, b + 2, c)
  }
  Object.assign(newFn, innerFn)
  return newFn
})()

有沒有更好一點的包裝方法?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(3)
淡淡烟草味

方法是沒錯,不過我總覺得你寫的有點彆扭……我覺得直接一點比較好……

// 原函数
function fn(a, b, c) {
  console.log(a, b, c)
}
// 加工函数
const addTwo = (fn) =>
    (a, b, c) =>
        fn(a, b + 2, c);
        
// 生成新函数
const newFn = addTwo(fn);

newFn(0, 0, 0);    //0 2 0
为情所困

想要 fn 每次呼叫的時候第二個參數總是加上 2

呃呃呃。 。

其實無非就是分別給參數加上 0, 2, 0

也就是說從函數 fn 產生另外一個 偏函数 fnOffset

把 [0, 2, 0] 這三個參數 分別加到 fn(a, b, c) 上的 a b c 上

更廣義的說:

[ .... ]n 个参数 分别加到 fn()arguments 的對應位置上

function fn(a, b, c){
    console.log(a, b, c); 
}

function adder(arr, fn, _this){
    _this = _this || window; 
    var toAdd = arr.slice(0, fn.length); 
    
    return function(){
        var argu = Array.prototype.slice.call(arguments); 
        
        fn.apply(_this, toAdd.map((item, idx) => {
            return argu[idx] + item; 
        })); 
    }
}

var fnOffset = adder([0, 2, 0], fn); 

fnOffset(0, 0, 0); 
fnOffset(2, 1, 0); 

fn020 做變數名稱 應該更優雅把 = =

左手右手慢动作

你描述的東西有點像ES6的Proxy,但這個是無法polyfill的,可能不太適合前端用。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板