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 に答える