2013-04-03 29 views
6

我有一個JavaScript對象,看起來是這樣的:將對象和函數轉換爲有效的JavaScript源代碼?

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

[Function]是一個實際的JavaScript函數。

我想和喜歡的內容寫這一個.js文件:

var Templates = /*source code here*/ 

我怎樣才能獲得源代碼,對象和功能性作爲一個字符串,這樣eval'ing這個「源代碼字符串「會讓我回到同一個對象?

+3

我不認爲我理解你的要求 –

+3

你試過在函數上調用'toString'嗎?對於一個對象,你可以使用JSON解析器。 –

+0

'.toString()'也返回「[object Object]」 – mpen

回答

4

我轉了轉自己的序列:

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") +'};'; 

這讓我回:

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) { ... } 
}; 

(爲簡便起見剪斷機構)

+1

我其實是在寫這樣的東西。很高興你知道了。 – Sethen

+0

這應該工作,但不要使用_如果問題沒有被標記爲這樣。 – Bart

+1

評估一個函數的toString表示不會一直工作。關閉狀態將失去一件事。還可能有其他問題? – hifier

1

如果我明白你說什麼,這會告訴我的功能代碼:

myObj = { 

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

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

我需要整個'myObj',而不僅僅是一個屬性。 – mpen

+0

@Mark您可以運行某種類型的循環來獲取它們的源代碼。 – Sethen

+0

包括花括號和屬性名稱。我想我可以用手寫這部分字符串,但我不太明白爲什麼我可以獲取函數的源代碼,但不能獲取對象部分的源代碼。 – mpen

2

在JavaScript函數是一個對象。 Function對象支持方法toString()。這實際上會給你一個函數的源代碼。就像這樣:

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

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

您可以使用JSON.stringify通過replacer參數來實現:

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

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

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

我沒有測試過這一點,但這個想法應該是合理的。

+0

運行該逐字記錄(除了缺少大括號),我回到'「鍵:[object Object]」。它仍然不能序列化對象。 – mpen

0

如果您可能需要使用Node.js的,你可以使用可以處理AST的lib。 你可能看看https://github.com/substack/node-falafel

+0

我真的不知道這是如何有用。看起來它可以讓你在擁有源代碼後操縱AST。我在首先獲得源代碼時遇到了困難,在確實擁有它之後我不需要操作。 – mpen

相關問題