覆盖JQuery函数(记录装饰器)

时间:2017-12-11 03:55:56

标签: javascript jquery

我想围绕jQuery函数创建一个日志装饰器,但它只被调用一次(在初始化时)。怎么解决?请查看代码。

function makeLogging(f) {

  function wrapper(...rest) {
      console.log(f.name);
      console.log(rest);
      return f.apply(this, rest);
    }

  return wrapper;
}

const task = $('.task');

task.on = makeLogging(task.on);

task.on('click', () => console.log('hi'));

click事件不会显示有关被调用函数的消息。

2 个答案:

答案 0 :(得分:1)

如果我抓住了你想要实现的想法,你这样做有点不对劲。对于您描述的功能,请尝试以下操作:

task.on('click', makeLogging(() => console.log('hi')));

在原始代码中,您包含了on()函数的功能,但此on()函数未被调用为事件处理程序 - 它只安装实际的事件处理程序。这就是为什么在安装处理程序期间只调用一次日志记录。

答案 1 :(得分:0)

答案的代码示例

function makeLogging(f) {

  function auxiliaryWrapper(x, rest) {
    return () => {
      console.log(f.name);
      console.log(rest);
      x();
    }
  }

  function mainWrapper(...rest) {
      const restWithWrap = rest.map(arg => {
        if (typeof arg === 'function') {
          return auxiliaryWrapper(arg,rest);
        }
        return arg;
      });
      console.log(restWithWrap);
      return f.apply(this, restWithWrap);
  }

  return mainWrapper;
}

const task = $('.task');

task.on = makeLogging(task.on);

task.on('click', () => console.log('hi'));