быстрый и грязный способ будет выглядеть так:
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;
};
Очевидно, что это будет влиять на сериализацию каждого объекта в вашем коде, и может подножку niave код, используя отфильтрованные for in
петли. «Правильный» способ состоял бы в том, чтобы написать рекурсивную функцию, которая добавила бы функцию toJSON
ко всем элементам потомства любого данного объекта, касающимся круговых ссылок и тому подобного. Однако, принимая однопоточный Javascript (нет веб-работников), этот метод должен работать и не создавать никаких непредвиденных побочных эффектов.
Аналогичная функция должна быть добавлена к прототипу Array для переопределения объекта путем возврата массива, а не объекта. Другим вариантом будет присоединение одного и пусть он выборочно возвращает массив или объект в зависимости от собственной природы объектов, но, вероятно, будет медленнее.
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
Я просто оставить комментарий, потому что я не предлагает полное решение. Одна вещь, которая может помочь, состоит в том, что вы можете выполнить функцию Function с вызовом 'toString()'. http://jsfiddle.net/HFMaz/ Не уверен в поддержке кросс-браузера. – user113716
это задают регулярно, но я не могу найти что-либо релевантное: \ почему вам нужно сериализовать функцию в любом случае? возможно, есть лучший способ организовать ваш код? – lincolnk
Это для проекта WYSIWYG. Каждый объект Javascript (с помощью методов) определяет поведение компонентов страницы. Содержимое страницы (включая поведение JS) должно быть сохранено на стороне сервера, следовательно, сериализовано. –