Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否将对象和函数转换为有效的JavaScript源代码?_Javascript_Node.js - Fatal编程技术网

是否将对象和函数转换为有效的JavaScript源代码?

是否将对象和函数转换为有效的JavaScript源代码?,javascript,node.js,Javascript,Node.js,我有一个JavaScript对象,看起来像这样: { bacon: [Function], hello: [Function], tables: [Function] } 其中,[Function]是一个实际的JavaScript函数 我想将其写入一个.js文件,其内容如下: var Templates = /*source code here*/ 如何将对象和函数属性的源代码作为字符串获取,以便评估此“源代码字符串”将返回相同的对象?如果我理解您的意思,这将向我显示函数代码: myObj

我有一个JavaScript对象,看起来像这样:

{ 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。我一开始在获取源代码时遇到了麻烦,在我获得了源代码之后,我就不需要再进行操作了。