Javascript 是否可以重写Function.prototype.toJSON,以便JSON.stringify可以使用函数?

Javascript 是否可以重写Function.prototype.toJSON,以便JSON.stringify可以使用函数?,javascript,json,prototype,function-object,to-json,Javascript,Json,Prototype,Function Object,To Json,或者甚至可以重写JSON.parse的某些部分来解析函数? 这对时间不敏感,我在代码中构建了一些变通方法,但使用eval函数,您可能会认为将函数转换为字符串并返回将是小菜一碟。这是可能的,但很奇怪,您当然无法访问解析函数的任何外部范围。调用toString获取函数的源代码,去掉括号,这样就只需要函数体,并让function.prototype.toJSON返回它。然后在解析时,对字符串调用new Function: Function.prototype.toJSON=Function(){ /

或者甚至可以重写JSON.parse的某些部分来解析函数? 这对时间不敏感,我在代码中构建了一些变通方法,但使用eval函数,您可能会认为将函数转换为字符串并返回将是小菜一碟。

这是可能的,但很奇怪,您当然无法访问解析函数的任何外部范围。调用
toString
获取函数的源代码,去掉括号,这样就只需要函数体,并让
function.prototype.toJSON
返回它。然后在解析时,对字符串调用
new Function

Function.prototype.toJSON=Function(){
//修剪开头和结尾{}s
返回此.toString().match(/[^{]*(?=}$)/)[0];
};
常数fn=()=>{
console.log('foo');
};
const json=json.stringify({
str:‘str’,
fn
});
log(json);
const parsed=JSON.parse(JSON);
const parsedFn=新函数(parsed.fn);

parsedFn()我认为没有必要去掉括号。我使用更简单的代码。它允许您将参数传递给函数:

Function.prototype.toJSON=Function(){返回this.toString();};
const json=json.stringify({
func:(a,b)=>{console.log(a,b);},
a:1
});
const parsed=JSON.parse(JSON);
const parsedFunc=Function('return'+parsed.func+';')();

parsedFunc('hello','world')将函数字符串化的目的是什么?当然,这是可能的
JSON.parse()
还有第二个参数,允许在解析后操作对象。您需要确定如何识别函数和常规字符串。这方面的用例是什么?只有在将数据从一个环境传输到另一个环境时,才需要JSON。然后您还需要在接收端创建一个解释器,因为函数很少是可互换的。在JS中,你总是可以使用一个包含方法的活动对象。我有这个“武器”对象,它有自己的攻击功能。每种武器都有自己的功能。我意识到我永远不需要保存当前加载,因为角色从不拾取或放下武器。这是一个潜在的XSS向量,不要将其用于外部数据,包括用户输入和您自己的数据库。