在另一个呼叫之前调用一个函数imediatly

时间:2017-09-29 09:27:24

标签: javascript

我正在使用一个库,而我正在尝试做的是,每次调用库上的函数时,我都想先调用我的函数。

让我们看看下面的代码,重新创建问题变得更容易理解:



var valueToConsole = 1;

function A(){
   console.log(valueToConsole)
}

function B(){
   valueToConsole = 2;
   A();
   valueToConsole = 1;
}

A();




我想要的是一种可以安慰" 2"值而不需要改变或覆盖函数A.我正在寻找一种方法,每次调用函数A时,在执行之前,我想执行函数B();

我们可以使用AspectJ来表达它。我在跳跃,我们在javascript中有类似的东西。

注意: 一个纯粹的JavaScript解决方案,如果可能的话,将不胜感激。

3 个答案:

答案 0 :(得分:0)

不,你只能覆盖功能。但你可以调用里面的旧实现。

我将展示jQuery find函数的示例,但您可以对包括全局函数在内的任何函数使用相同的方法。



(function () {
  var old = $.fn.find;
  
  $.fn.find = function () {
    console.log(arguments);
    return old.apply(this, arguments);
  };
})();

console.log($("body").find("script").attr('src'));

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

对于那些认为我的代码使用jQuery的人:不,它没有
修补另一件事的同样例子:

&#13;
&#13;
var lib = {
  doInner: function (x) {
    return 38 + x;
  },
  doSmth: function (x) {
    return this.doInner(x * x);
  },
  doOther: function (x, y) {
    return this.doSmth(x - y);
  }
};

(function () {
  var old = lib.doSmth;
  
  lib.doSmth = function () {
    console.log(arguments);
    return old.apply(this, arguments);
  };
})();

console.log(lib.doSmth(2));
console.log(lib.doOther(8, 6));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以使用其中的函数创建一个类,并在构造函数中调用console.log:

class Example {
    constructor() {
        console.log('A')
    }

    myFunc(arg) {
        console.log(arg)
    }
}

let exampleInstance = new Example();//logs A
exampleInstance.myFunc('hello');// logs hello

答案 2 :(得分:0)

  

每次调用库上的函数时,我都想先调用我的函数。

您可以通过首先调用函数,然后使用库函数来覆盖库函数。

逻辑

  • 创建一个将保留对原始函数的引用的变量。
  • 现在覆盖lib的功能。调用你的函数和上面包含ref的变量的调用。

<强>示例:

&#13;
&#13;
var utils = (function(){
  function printHead() {
    console.log('*'.repeat(25));
  }

  function print(str) {
    printHead();
    console.log(str);
    printHead();
  }
  
  return {
    print: print
  }
})();

utils.print('Hello World');

function customHead(){
  console.log('='.repeat(25));
}

var dummy = utils.print;

utils.print = function(){
  customHead();
  dummy();
  customHead();
}

utils.print('Hello World');
&#13;
&#13;
&#13;