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?
Sie können geschachtelte Funktionsdefinitionen nicht überschreiben, nur die Hauptfunktion. – Barmar
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
Gut zu wissen. Aber warum nicht? Wenn du ein bisschen mehr @Barmar in einer Antwort ausarbeiten kannst, akzeptiere ich. – Robbie