当调用大且不可编辑的库中的某个函数时,我是否可以捕获(触发事件)?
// 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));
如果库已将属性设置为只读和不可配置,则无法对其进行包装,但这种情况很少见。