2013-04-03 7 views
6

Ich habe ein JavaScript-Objekt, das etwa wie folgt aussieht:Konvertieren von Objekten und Funktionen in gültigen JavaScript-Quellcode?

{ bacon: [Function], hello: [Function], tables: [Function] } 

Wo [Function] eine tatsächliche Funktion JavaScript ist.

Ich möchte dies mit Inhalt auf eine .js Datei schreiben wie:

var Templates = /*source code here*/ 

Wie kann ich den Quellcode für die Objekt- und Funktionseigenschaften als String zu erhalten, so dass eval'ing diesen „Quellcode string "wird mir das selbe Objekt zurückgeben?

+3

Ich glaube nicht, dass ich Ihre Anforderung verstanden –

+3

Haben Sie versucht, 'toString' auf der Funktion? Für ein Objekt könnten Sie einfach einen JSON-Parser verwenden. –

+0

'.toString()' gibt auch "[object Object]" zurück – mpen

Antwort

4

ich meine eigenen Serializer gerollt:

var templates = { /* object to stringify */ }; 
var properties = []; 
_.each(templates, function(value, key) { 
    properties.push(JSON.stringify(key)+': '+value.toString()); 
}); 
var sourceCode = 'var Templates = {' + properties.join(",\n") +'};'; 

Das gibt mir zurück:

var Templates = {"bacon": function anonymous(locals, attrs, escape, rethrow, merge) { ... }, 
"hello": function anonymous(locals, attrs, escape, rethrow, merge) { ... }, 
"tables": function anonymous(locals, attrs, escape, rethrow, merge) { ... } 
}; 

(snipped Körper der Kürze halber)

+1

Ich habe tatsächlich so etwas geschrieben. Ich bin froh, dass du es herausgefunden hast. – Sethen

+0

Dies sollte funktionieren, aber _ nicht verwenden, wenn die Frage nicht als solche markiert wurde. – Bart

+1

Das Auslesen der ToString-Repräsentation einer Funktion wird nicht immer funktionieren. Der Schließzustand wird für eine Sache verloren sein. Es könnte auch andere Probleme geben? – hifier

1

Wenn ich verstehe, was Sie versuchen, zu sagen, das würde mir zeigen den Funktionscode:

myObj = { 

    myMethod: function() { 
     console.log("This is my function"); 
    } 
} 

console.log(myObj.myMethod.toString()); 
+0

Ich brauche die Gesamtheit von 'myObj', nicht nur eine Eigenschaft. – mpen

+0

@Mark Sie könnten eine Art von Schleife ausführen, um die Quelle für alle zu erhalten. – Sethen

+0

Curly-Klammern und Eigenschaftsnamen enthalten. Ich denke, ich könnte diesen Teil der Zeichenfolge von Hand schreiben, aber ich verstehe nicht ganz, warum ich die Quelle für eine Funktion bekommen kann, aber nicht den Objektteil. – mpen

2

In Javascript eine Funktion ein Objekt ist. Das Objekt Function unterstützt die Methode toString(). Dadurch erhalten Sie den Quellcode einer Funktion. Wie folgt aus:

function foo() { 
    var a = 1 + 1; 
} 

alert(foo.toString()); // will give you the above definition 
0

können Sie JSON.stringify verwenden, um dies zu erreichen über das replacer Argument:

var myObj = { a : 1, b : function(val) { doStuff(); }; 

var replacer = function(key, val) { 
     return "key : " + val.toString(); 
}; 

console.log(JSON.stringify(myObj, replacer)); 

Ich habe nicht getestet, aber die Idee sollte gesund sein.

+0

Das wörtlich ausführen (abgesehen von einer fehlenden geschweiften Klammer), bekomme ich zurück "" Schlüssel: [Objekt-Objekt] "'. Das Objekt kann immer noch nicht serialisiert werden. – mpen

0

Wenn Sie node.js verwenden möchten können Sie kann eine Lib benutzen, die mit ASTs umgehen kann. Sie können sehen https://github.com/substack/node-falafel

+0

Ich bin mir wirklich nicht sicher, wie das hilfreich ist. Es sieht so aus, als ob Sie die AST manipulieren können, sobald Sie den Quellcode haben. Ich hatte Probleme, den Quellcode überhaupt zu bekommen, und ich muss nicht manipulieren, nachdem ich ihn habe. – mpen

Verwandte Themen