2016-05-06 9 views
1

Ich versuche, eine JavaScript-Bibliothek von Drittanbietern zu installieren, aber die ursprüngliche Funktionsdefinition, die ich überlaste, wird immer aufgerufen.Eine JavaScript-Funktionsdefinition überschreiben

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

OUTPUT:

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

Ich denke, das liegt daran, dass diese Funktion indirekt durch eine andere Funktion aufgerufen wird, und diese Funktion kann eine Schließung auf die Funktion, um es zeigt halten - so vielleicht dieses isn‘ t möglich? Irgendwelche Vorschläge zum Überschreiben?

jsfiddle

+1

Sie können geschachtelte Funktionsdefinitionen nicht überschreiben, nur die Hauptfunktion. – Barmar

+1

In diesem Fall müssen Sie alle Funktionen von 'oldTopFxn' implementieren und können sie nicht mehr aufrufen. Und wenn "oldTopFxn" einige innere Funktionen verwendet, müssen Sie möglicherweise auch ihre Funktionalität implementieren, da Sie nicht direkt darauf zugreifen können. Oder Sie rufen 'oldTopFxn' auf und korrigieren das Ergebnis, soweit dies möglich ist. Können Sie die konkrete Bibliothek und das Problem, das Sie patchen möchten, benennen/verlinken? damit wir Ihnen eine bessere Empfehlung geben können, was Ihre Möglichkeiten sind – Thomas

+0

Gut zu wissen. Aber warum nicht? Wenn du ein bisschen mehr @Barmar in einer Antwort ausarbeiten kannst, akzeptiere ich. – Robbie

Antwort

1

können Sie nicht eine lokale Funktion in einer anderen Funktion außer Kraft setzen, da der Geltungsbereich von Variablen. Der Name _toOverride ist für jede Funktion lokal, und die Zuweisung in Ihrer Funktion hat keine Auswirkung auf die gleichnamige Funktion in einer anderen Funktion.

Sie müssten ns.pubFxn überschreiben.

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"); 
}; 
Verwandte Themen