是否将对象和函数转换为有效的JavaScript源代码?
我有一个JavaScript对象,看起来像这样:是否将对象和函数转换为有效的JavaScript源代码?,javascript,node.js,Javascript,Node.js,我有一个JavaScript对象,看起来像这样: { bacon: [Function], hello: [Function], tables: [Function] } 其中,[Function]是一个实际的JavaScript函数 我想将其写入一个.js文件,其内容如下: var Templates = /*source code here*/ 如何将对象和函数属性的源代码作为字符串获取,以便评估此“源代码字符串”将返回相同的对象?如果我理解您的意思,这将向我显示函数代码: myObj
{ bacon: [Function], hello: [Function], tables: [Function] }
其中,[Function]
是一个实际的JavaScript函数
我想将其写入一个.js
文件,其内容如下:
var Templates = /*source code here*/
如何将对象和函数属性的源代码作为字符串获取,以便评估此“源代码字符串”将返回相同的对象?如果我理解您的意思,这将向我显示函数代码:
myObj = {
myMethod: function() {
console.log("This is my function");
}
}
console.log(myObj.myMethod.toString());
在Javascript中,函数是一个对象。
函数
对象支持方法toString()
。这实际上将为您提供函数的源代码。像这样:
function foo() {
var a = 1 + 1;
}
alert(foo.toString()); // will give you the above definition
您可以使用通过replacer
参数来完成此操作:
var myObj = { a : 1, b : function(val) { doStuff(); };
var replacer = function(key, val) {
return "key : " + val.toString();
};
console.log(JSON.stringify(myObj, replacer));
我还没有对此进行测试,但这个想法应该是合理的。我推出了自己的序列化程序:
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) { ... }
};
(为了简洁起见,删节了正文)如果您想使用node.js,可以使用一个可以处理AST的库。
您可以查看一下我想我不明白您的要求。您是否尝试调用函数上的
toString
?对于一个对象,您可以只使用JSON解析器。.toString()
也会返回“[object object]”。toString()
实际上似乎对函数有效,但对对象无效。@ChrisHayes:为什么它没有意义?让我重新表述一下:我想要一个字符串,这样对它调用eval()
将产生完全相同的对象。JSON不能表示函数。我需要完整的myObj
,而不仅仅是一个属性。@标记您可以运行某种循环来获取所有函数的源代码。包括大括号和属性名。我想我可以手工编写字符串的这一部分,但我不太明白为什么我可以得到函数的源代码而不是对象部分。这可能是因为对象可以有对自身的引用。你不能序列化递归对象。@Bart:这是一个很好的观点。然而,在这种情况下,我没有,但这可以解释为什么这可能无法实现。运行该逐字记录(除了缺少一个大括号之外),我将返回“key:[object object]”
。它仍然无法序列化对象。实际上我正在写类似的东西。很高兴你找到了答案。这应该行得通,但如果问题没有被标记为这样,就不要使用。评估函数的toString表示法不会一直有效。关闭状态将丢失一件事。可能还有其他问题吗?@Bart:我在。。。我有权访问下划线。@hifier:是的……肯定有问题。如果你看一下我发布的输出,那肯定不是函数的完整来源,因为当我执行这些函数时,它们会做一些不同的事情。我现在正想弄明白。我真的不知道这有什么帮助。它看起来可以让您在获得源代码后操作AST。我一开始在获取源代码时遇到了麻烦,在我获得了源代码之后,我就不需要再进行操作了。