2017-01-24 4 views
1

Ich habe einen Abschnitt im Code, wo ich die Funktion durch ihren Namen überschreiben muss. Eine vereinfachte Version davon ist hier:ist es möglich, den kompilierten Funktionsnamen von google closure aus innerhalb des Codes zu erhalten?

function override(obj, funcName){ 
    if(obj && obj[funcName]) 
     obj[funcName] = function(){ alert("Haha, now it's different func!"); } 
    else 
     console.error("Object does not contain function "+funcName); 
} 

Es funktioniert perfekt, wenn ich es mit Google Closure kompilieren, dann, natürlich, es funktioniert nicht, weil Funktion obj.doSomethingBeneficial smth wird wie obj.qq ...

Die Frage ist also: Ist es möglich, innerhalb des Codes zu wissen, was der kompilierte Name der Funktion ist? Dann könnte ich es richtig überschreiben.

Antwort

1

Der Compiler erkennt einen speziellen Funktionsnamen, mit dem Sie eine Zeichenfolge genauso umbenennen können, wie eine Eigenschaft umbenannt würde: goog.reflect.objectProperty(prop name, obj). Die Funktion ist Teil der Closure-Bibliothek, Sie können sie jedoch selbst definieren, ohne die Closure-Bibliothek einzubeziehen.

var goog = { reflect: { objectProperty: function(name, obj) { return name; } } }; 
if (obj && obj['funcName']) { 
    obj[goog.reflect.objectProperty('funcName', obj)] = 
     function(){ alert("Haha, now it's different func!"); }; 
} else { 
    console.error("Object does not contain function "+ 'funcName'); 
} 

Die einzige Einschränkung ist, dass der erste Parameter auf eine goog.reflect.objectProperty Stringliteral sein muss. Sie können keine Variable verwenden.

+0

Danke, aber wie würde ich es in meinem Fall verwenden, könnten Sie ein Beispiel geben? Ich verstehe nur nicht, wie ich für den Compiler klar machen könnte, dass ich den verkürzten Namen für dieses bestimmte Objekt, an dem ich arbeite, haben möchte ... – shal

+0

@shal hat ein Beispiel hinzugefügt –

Verwandte Themen