【问题标题】:Adding "toJSON" method a JavaScript object instance causes Maximum Callstack error在 JavaScript 对象实例中添加“toJSON”方法会导致最大调用堆栈错误
【发布时间】: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


【解决方案1】:

这不是 .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));

【讨论】:

  • 非常酷 - 我不知道 JSON.stringify fn 的行为是首先尝试调用它正在字符串化的对象的 toJSON 方法!我假设它只涉及剥离函数和原型属性并将其余部分转换为字符串的过程。谢谢,干杯!
  • 关于JSON.stringify():developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…的更多信息在MDN的页面上:-)
猜你喜欢
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2012-03-11
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
相关资源
最近更新 更多