2016-05-26 5 views
0

Ich frage mich, ist es möglich, Funktion von Drittanbietern (wie Monkey-Patching [wiki], [nice article]) in einer Weise zu ändern einige Zeilen in der Mitte dieser Funktionen?Wie zu modifizieren (Affe-Patching) Drittanbieter-Funktion auf bestimmte Linie

Beispiel von dem, was ich will:

von Drittanbietern (Patchen Ziel):

var obj = { 
    sum: function (a) { 
    var b = 1; 
    //Here I want to add a line: 
    // b = 2 
    return a + b; 
    } 
}; 

NB: Ich weiß, dass wir benutzerdefinierte Funktionen vor und nach ein Original-Funktionsaufruf ausführen können , aber ich möchte benutzerdefinierten Code in der Mitte des Körpers der ursprünglichen Funktion ausführen.

UPD: Ich werde meine Gedanken unten als Antwort teilen, aber es ist hässlich, also möchte ich andere Wege finden.

+1

Sie können einfach die * Summe ersetzen * Funktion, wenn Sie wollen: 'obj.sum = function() {/ * Ihre Sachen * /};' . – RobG

+0

@RobG Ja, danke, es ist viel einfacher, aber in einigen Fällen nicht anwendbar –

Antwort

0

Dies ist ein bisschen hässliche Art, das zu tun. Ich habe es nicht gut testen, aber es sollte die Arbeit:

// Split function into array of strings 
    var arr = obj.sum.toString().split('\n'); 
    // Insert our expression (b = 2) at "line 2" 
    arr.splice(2, 0, "b = 2"); 
    // Remove first line: "function (a) {" (to be honest we should first parse and remember args) 
    arr.splice(0, 1) 
    //Remove last line: "}" 
    arr.splice(arr.length-1, 1) 
    // Create a string with our function 
    var str = arr.join("\n") 
    //Create function with new Function() 
    var newFunc = new Function("a", str); //a -is our argument for "sum" func 
    obj.sum = newFunc; 
Verwandte Themen