覆盖javascript函数定义

时间:2016-05-06 22:53:29

标签: javascript monkeypatching

我正在尝试monkeypatch第三方javascript库,但我正在重载的原始函数定义不断被调用。

var ns = {};

ns.topFxn = function(){
    var _me = "me";
    function _toOverride(){
        console.log("This is the original: " + _me);
    }
    function pubFxn(){
        _toOverride();
    }
    console.log("Original");
    ns.pubFxn = pubFxn;
};

//attempt to monkey patch
var oldTopFxn = ns.topFxn;
ns.topFxn = function(){
    oldTopFxn();
    function _toOverride(){
        console.log("This is the overriden: " + _me);
    }
    console.log("MonkeyPatch");
};

ns.topFxn();
ns.pubFxn();

输出:

scratch.js:15> Original
scratch.js:26> MonkeyPatch
scratch.js:10> This is the original: me

我认为这是因为这个函数是由另一个函数间接调用的,而且该函数可能会对它所指向的函数进行闭包 - 所以这可能不可能吗?有关如何覆盖的任何建议吗?

jsfiddle

1 个答案:

答案 0 :(得分:2)

由于范围可变,您无法覆盖其他函数中的本地函数。名称_toOverride对于每个函数都是本地的,并且在函数中分配它对于在不同函数中具有相同名称的函数没有影响。

您必须覆盖ns.pubFxn

var oldTopFxn = ns.topFxn;
ns.topFxn = function(){
    oldTopFxn();
    var oldPubFxn = ns.pubFxn;
    function _toOverride(){
        console.log("This is the overriden: " + _me);
    }
    ns.pubFxn = function() {
        oldPubFxn();
        _toOverride();
    }
    console.log("MonkeyPatch");
};