我有一个看起来像这样的 JavaScript 对象:
{ bacon: [Function], hello: [Function], tables: [Function] }
[Function]
实际的 JavaScript 函数在哪里。
我想把它写到一个.js
内容如下的文件中:
var Templates = /*source code here*/
如何将对象和函数属性的源代码作为字符串获取,以便评估此“源代码字符串”将返回相同的对象?
我有一个看起来像这样的 JavaScript 对象:
{ bacon: [Function], hello: [Function], tables: [Function] }
[Function]
实际的 JavaScript 函数在哪里。
我想把它写到一个.js
内容如下的文件中:
var Templates = /*source code here*/
如何将对象和函数属性的源代码作为字符串获取,以便评估此“源代码字符串”将返回相同的对象?
我推出了自己的序列化程序:
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) { ... }
};
(为简洁起见,剪掉了身体)
在 Javascript 中,函数是一个对象。该Function
对象支持该方法toString()
。这实际上会给你一个函数的源代码。像这样:
function foo() {
var a = 1 + 1;
}
alert(foo.toString()); // will give you the above definition
如果我明白你想说什么,这将向我显示功能代码:
myObj = {
myMethod: function() {
console.log("This is my function");
}
}
console.log(myObj.myMethod.toString());
您可以使用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));
我没有对此进行测试,但这个想法应该是合理的。
如果您可能想使用 node.js,您可以使用可以处理 AST 的库。你可以看看https://github.com/substack/node-falafel