【发布时间】:2015-12-27 06:22:38
【问题描述】:
我想为实例化的 JavaScript 对象添加一个 .toJson 方法,这将允许我在请求期间获取不带函数和原型的字符串化对象实例。
然而,函数 'toJSON' 作为方法名的实际名称似乎会影响 JavaScript 引擎(至少在 V8 中)运行该函数的能力 - 也就是说,如果您将相同的函数重命名为“ JSON”而不是“toJSON”,它可以工作,但是,作为“toJSON”,它会导致最大调用堆栈错误。见例子:
function P1(name, age){
this.name = name;
this.age= age;
this.toJSON = function(){
return JSON.stringify(this);
}
}
function P2(name, age){
this.name = name;
this.age= age;
this.JSON = function(){
return JSON.stringify(this);
}
}
// This causes an error: Uncaught RangeError: Maximum call stack size exceeded(…)
var p1 = new P1('Memory Error', 10);
try {
p1.toJSON();
} catch(e){
console.log(e);
}
var p2 = new P2('No Error', 20);
p2.JSON();
这是 JavaScript 的预期行为吗?它是否与“toJSON”作为本机方法有关(注意:我已经验证在上面的实例化对象上,原型上没有 toJSON 方法会干扰实例上的重新定义)?我正在尝试确定是否应该将此作为错误报告给 V8 团队,或者这可以由更了解该规范的人解释。
谢谢
【问题讨论】:
-
JSON.stringify调用对象的toJSON方法。这调用JSON.stringify调用toJSON调用JSON.stringify... -
JSON.stringify()将调用对象上定义的toJSON()函数。希望您能明白为什么会出现问题...
标签: javascript json ecmascript-5