gpt4 book ai didi

javascript - 在 JavaScript 对象实例中添加 "toJSON"方法会导致最大调用堆栈错误

转载 作者:行者123 更新时间:2023-12-01 15:52:17 25 4
gpt4 key购买 nike

我想添加一个 .toJson实例化 JavaScript 对象的方法,这将允许我在请求期间获取没有函数和原型(prototype)的字符串化对象实例。

但是,函数“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”作为 native 方法有关(注意:我已经验证在上面的实例化对象上,原型(prototype)上没有 toJSON 方法会干扰实例上的重新定义)?我正在尝试确定是否应该将此作为错误报告给 V8 团队,或者这可以由更了解该规范的人来解释。

谢谢

最佳答案

这不是 .toJSON方法用于。您使用 .toJSON覆盖默认的字符串化行为。 .toJSONJSON.stringify 内部调用,你不需要自己调用它。 .toJSON可以返回一个字符串、对象、数组,无论你想在来自 JSON.stringify 的响应中被字符串化。 .

您的 .toJSON除了调用 JSON.stringify(this) 之外,方法还需要做一些事情.现在你得到一个无限循环,因为 JSON.stringify(this)调用对象的 .toJSON , 等等。

尝试这样的事情:

function P1(name, age){
this.name = name;
this.age= age;
this.toJSON = function(){
return {
name: this.name,
age: this.age
};
}
}

var p1 = new P1('Test', 10);
console.log(JSON.stringify(p1));

关于javascript - 在 JavaScript 对象实例中添加 "toJSON"方法会导致最大调用堆栈错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32849598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com