9

为什么 JSON.stringify() 不显示 prop2?

var newObj = {
  prop1: true,
  prop2: function(){
    return "hello";
  },
  prop3: false
};

alert( JSON.stringify( newObj ) ); // prop2 appears to be missing

alert( newObj.prop2() ); // prop2 returns "hello"

for (var member in newObj) {
    alert( member + "=" + newObj[member] ); // shows prop1, prop2, prop3
}

JSFIDDLE:http: //jsfiddle.net/egret230/efGgT/

4

3 回答 3

20

因为JSON不能存储函数。根据规范,值必须是以下之一:

有效的 JSON 值
(来源:json.org


作为旁注,此代码将使函数注意到JSON.stringify

Function.prototype.toJSON = function() { return "Unstorable function" }
于 2012-05-23T23:28:59.983 回答
5

这是使用 .prototype 的另一种方式。您可以添加一个函数来字符串化

JSON.stringify(obj, function(k, v) {
  if (typeof v === 'function') {
    return v + '';
  }
  return v;
});
于 2013-03-24T11:37:28.070 回答
2

它不应该对方法(或任何函数)进行字符串化 - 特别是因为大多数内置对象的方法(以及任何用户定义对象的原型)都是本机代码。

如果你真的需要它来打印你的方法,你可以覆盖你的对象的 .toString 方法,但是当你在字符串化的输出上调用 JSON.parse 时,它​​会将方法当作只是一个字符串,并且能够将其作为您必须使用的功能来调用eval- 通常不推荐这种做法。

于 2012-05-23T23:36:46.600 回答