Una manera rápida y sucia sería así:
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;
};
Obviamente, esto afectará a la serialización de cada objeto en su código, y podría tropezar código niave usando for in
bucles sin filtrar. La forma "correcta" sería escribir una función recursiva que agregaría la función toJSON
en todos los miembros descendientes de cualquier objeto dado, tratando con referencias circulares y tal. Sin embargo, suponiendo Javascript de un solo hilo (sin Web Workers), este método debería funcionar y no producir efectos secundarios no deseados.
Se debe agregar una función similar al prototipo de Array para anular Object devolviendo una matriz y no un objeto. Otra opción sería adjuntar una sola y dejar que devuelva selectivamente una matriz o un objeto dependiendo de la naturaleza de los objetos, pero probablemente sea más 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
Voy a dejar un comentario porque no estoy ofreciendo una solución completa. Una cosa que puede ayudar es que puede stringificar una función con una llamada a 'toString()'. http://jsfiddle.net/HFMaz/ No estoy seguro acerca de la compatibilidad entre navegadores. – user113716
esto se pregunta con regularidad pero no encuentro nada relevante: \ ¿Por qué necesita serializar la función de todos modos? tal vez hay una mejor manera de organizar su código? – lincolnk
Esto es para proyecto WYSIWYG. Cada objeto Javascript (con métodos) define el comportamiento de los componentes de la página. El contenido de la página (incluido el comportamiento de JS) debe guardarse en el lado del servidor, por lo tanto serializado. –