Un modo rapido e sporco sarebbe stato così:
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;
};
Ovviamente questo influenzerà la serializzazione di ogni oggetto nel codice, e potrebbe inciampare Codice niave utilizzando filtrati for in
loop. Il modo "corretto" sarebbe quello di scrivere una funzione ricorsiva che aggiungerebbe la funzione toJSON
a tutti i membri discendenti di un dato oggetto, occupandosi di riferimenti circolari e simili. Tuttavia, assumendo Javascript con thread singolo (senza Web Workers), questo metodo dovrebbe funzionare e non produrre effetti collaterali indesiderati.
Una funzione simile deve essere aggiunta al prototipo di Array per sovrascrivere l'oggetto restituendo un array e non un oggetto. Un'altra opzione sarebbe quella di allegare una singola e lasciare che restituisca una matrice o un oggetto in modo selettivo a seconda della natura degli oggetti, ma probabilmente sarebbe più lenta.
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
mi limiterò a lasciare un commento, perché non sto offrendo una soluzione completa. Una cosa che può essere d'aiuto è che puoi stringificare una funzione con una chiamata a 'toString()'. http://jsfiddle.net/HFMaz/ Non sono sicuro del supporto cross-browser. – user113716
viene chiesto regolarmente ma non riesco a trovare nulla di rilevante: \ perché è necessario serializzare la funzione in ogni caso? forse c'è un modo migliore per organizzare il tuo codice? – lincolnk
Questo è per il progetto WYSIWYG. Ogni oggetto Javascript (con metodi) definisce il comportamento dei componenti della pagina. Il contenuto della pagina (incluso il comportamento JS) deve essere salvato lato server, quindi serializzato. –