javascript catch函数调用



当调用大且不可编辑的库中的某个函数时,我是否可以捕获(触发事件)

// big js library
var biglibrary = {
runme: function(arguments){
// do something...
},
otherfunctions: function(.....
}

现在,当runme被调用时,我如何在上方的外部捕获/注意?我可以吗?我试过这样的东西->

$(biglibrary).on('runme', function(){
// function was called !!!
});

在绝大多数情况下,您可以包装函数:

const original = biglibrary.runme;
biglibrary.runme = function(...args) {
console.log("Function was called!");
return original.apply(this, args);
};

const biglibrary = {
runme: function(a, b) {
console.log(`Original function: ${a} + ${b}`);
return a + b;
},
};
const original = biglibrary.runme;
biglibrary.runme = function(...args) {
console.log("Function was called!");
return original.apply(this, args);
}
console.log(biglibrary.runme(1, 2));

这有时被称为";猴子补丁">

在某些情况下,库可能已将runme属性设置为只读,在这种情况下,可能能够通过Object.defineProperty:对其进行包装

const original = biglibrary.runme;
const descr = Object.getOwnPropertyDescriptor(biglibrary, "runme");
descr.value = function(...args) {
console.log("Function was called!");
return original.apply(this, args);
}
Object.defineProperty(biglibrary, "runme", descr);

const biglibrary = {
runme: function(a, b) {
console.log(`Original function: ${a} + ${b}`);
return a + b;
},
};
const original = biglibrary.runme;
const descr = Object.getOwnPropertyDescriptor(biglibrary, "runme");
descr.value = function(...args) {
console.log("Function was called!");
return original.apply(this, args);
}
Object.defineProperty(biglibrary, "runme", descr);
console.log(biglibrary.runme(1, 2));

如果库已将属性设置为只读不可配置,则无法对其进行包装,但这种情况很少见。

最新更新