2012-05-23 10 views
6

Warum zeigt JSON.stringify() prop2 nicht an?Warum zeigt JSON.string nicht Anzeigeobjekteigenschaften an, die Funktionen sind?

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/

+1

@BrandtSolovij stringify hinzufügen: Funktionen sind Objekte: versuchen 'laufen (function() {}) instanceof Object' – Eric

Antwort

16

Da JSON keine Funktionen speichern. Gemäß der Spezifikation muss ein Wert einer der folgenden sein:

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


Als Randbemerkung, dieser Code die Funktionen bemerkt von JSON.stringify machen:

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

Also in diesem Fall, JSON kann nicht speichern' undefined'? –

+1

@Derek: Richtig. Ich glaube, 'JSON.stringify' konvertiert es in' null' – Eric

+3

@Derek: 'JSON.stringify' lässt Mitglieder mit' undefinierten' Werten aus. Eine Variable, die auf "undefiniert" gesetzt ist, kann nicht von einer Variable unterschieden werden, die nie gesetzt wurde. – apsillers

2

Es ist nicht anzunehmen Methoden (oder andere Funktionen) stringieren - insbesondere, da die meisten Methoden von eingebauten Objekten (und somit die Prototypen beliebiger benutzerdefinierter Objekte) systemeigener Code sind.

Wenn Sie wirklich es brauchen Ihre Methoden zu drucken, können Sie Ihr Objekt .toString Methode überschreiben, aber wenn man JSON.parse auf der Zeichenfolge Ausgabe aufrufe, wird die Methode behandeln, als ob es nur eine Zeichenfolge war , und um es als eine Funktion nennen zu können, müssten Sie eval es - eine Praxis, die in der Regel nicht empfohlen wird.

3

Hier ist ein anderer Weg mit einem Prototyp. Sie können eine Funktion

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