我正在使用一个库,而我正在尝试做的是,每次调用库上的函数时,我都想先调用我的函数。
让我们看看下面的代码,重新创建问题变得更容易理解:
var valueToConsole = 1;
function A(){
console.log(valueToConsole)
}
function B(){
valueToConsole = 2;
A();
valueToConsole = 1;
}
A();

我想要的是一种可以安慰" 2"值而不需要改变或覆盖函数A.我正在寻找一种方法,每次调用函数A时,在执行之前,我想执行函数B();
我们可以使用AspectJ来表达它。我在跳跃,我们在javascript中有类似的东西。
注意: 一个纯粹的JavaScript解决方案,如果可能的话,将不胜感激。
答案 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;
对于那些认为我的代码使用jQuery的人:不,它没有。
修补另一件事的同样例子:
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;
答案 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)
每次调用库上的函数时,我都想先调用我的函数。
您可以通过首先调用函数,然后使用库函数来覆盖库函数。
<强>示例:强>
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;