Eine schnelle und schmutzige Art und Weise so sein würde:
Object.prototype.toJSON = function() {
var sobj = {}, i;
for (i in this)
if (this.hasOwnProperty(i))
sobj[i] = typeof this[i] == 'function' ?
this[i].toString() : this[i];
return sobj;
};
Offensichtlich ist dies die Serialisierung jedes Objekt in Ihrem Code auswirken wird, und könnte niave Code mit ungefilterten for in
Schleifen stolpern. Die „richtige“ Weg wäre, eine rekursive Funktion zu schreiben, die die toJSON
Funktion auf allen Nachkomme Mitglieder eines bestimmten Objekts hinzufügen würde, die sich mit zirkulären Referenzen und so. Unter der Annahme von single-threaded Javascript (keine Web Workers) sollte diese Methode jedoch funktionieren und keine unbeabsichtigten Nebenwirkungen erzeugen. Objekt außer Kraft zu setzen, indem eine Anordnung zurückkehrt und nicht ein Objekt
muss eine ähnliche Funktion wie Array Prototyp hinzugefügt werden. Eine andere Option wäre, eine einzelne anzuhängen und sie selektiv ein Array oder ein Objekt zurückgeben zu lassen, abhängig von der Eigenart der Objekte, aber wahrscheinlich langsamer.
function JSONstringifyWithFuncs(obj) {
Object.prototype.toJSON = function() {
var sobj = {}, i;
for (i in this)
if (this.hasOwnProperty(i))
sobj[i] = typeof this[i] == 'function' ?
this[i].toString() : this[i];
return sobj;
};
Array.prototype.toJSON = function() {
var sarr = [], i;
for (i = 0 ; i < this.length; i++)
sarr.push(typeof this[i] == 'function' ? this[i].toString() : this[i]);
return sarr;
};
var str = JSON.stringify(obj);
delete Object.prototype.toJSON;
delete Array.prototype.toJSON;
return str;
}
http://jsbin.com/yerumateno/2/edit
werde ich einen Kommentar hinterlassen, nur weil ich eine vollständige Lösung nicht anbietet. Eine Sache, die helfen kann, ist, dass Sie eine Funktion mit einem Aufruf von 'toString()' stringifizieren können. http://jsfiddle.net/HFMaz/ Nicht sicher über die browserübergreifende Unterstützung. – user113716
Dies wird regelmäßig gefragt, aber ich kann nichts relevantes finden: \ Warum müssen Sie die Funktion trotzdem serialisieren? Vielleicht gibt es eine bessere Möglichkeit, Ihren Code zu ordnen? – lincolnk
Dies ist für WYSIWYG-Projekt. Jedes Javascript-Objekt (mit Methoden) definiert das Verhalten von Seitenkomponenten. Der Seiteninhalt (einschließlich des JS-Verhaltens) muss serverseitig gespeichert und somit serialisiert werden. –