繁体   English   中英

javascript 接function 电话

[英]javascript catch function call

当调用大型不可编辑库中的某个 function 时,我可以捕获(触发事件)吗?

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

现在,当runme被调用时,我怎么能在上面捕获/注意? 我可以吗? 我试过这样的事情 - >

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

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

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));

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM