2016-05-06 7 views
1

Я пытаюсь обезвреживать стороннюю библиотеку javascript, но исходное определение функции я перегружаю, все время вызывается.Переопределение определения функции 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 

Я думаю, это потому, что эта функция косвенно вызывается другой функцией, и эта функция может провести замыкание на функцию он указывает - значит, может быть, это ISN» возможно? Любые предложения о том, как переопределить?

jsfiddle

+1

Вы не можете переопределять определения вложенных функций, а только основную функцию. – Barmar

+1

В этом случае вы должны реализовать всю функциональность 'oldTopFxn' и больше не можете ее вызывать. И если 'oldTopFxn' использует некоторые внутренние функции, вам, возможно, придется реализовать их функциональность, так как вы не можете получить к ним доступ напрямую. Или вы вызываете 'oldTopFxn' и фиксируете результат, насколько это возможно. Можете ли вы назвать/связать конкретную библиотеку и проблему, которую хотите исправить? так что мы могли бы дать вам лучшую рекомендацию, какие у вас варианты – Thomas

+0

Полезно знать. Но почему нет? Если вы сможете немного больше пояснить @Barmar в ответе, я соглашусь. – Robbie

ответ

1

Вы не можете переопределить локальную функцию в другой функции, из-за переменного объема. Имя _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"); 
};