为什么JSON.stringify不显示作为函数的对象属性?

时间:2012-05-23 23:27:01

标签: javascript json function object stringify

为什么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/

3 个答案:

答案 0 :(得分:17)

因为JSON无法存储功能。根据规范,值必须是以下之一:

Valid JSON values http://json.org/value.gif


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

Function.prototype.toJSON = function() { return "Unstorable function" }

答案 1 :(得分:3)

这是使用.prototype的另一种方法。您可以添加一个函数来stringify

JSON.stringify(obj, function(k, v) {
  if (typeof v === 'function') {
    return v + '';
  }
  return v;
});

答案 2 :(得分:2)

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

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