Быстрый и грязный способ будет выглядеть следующим образом:
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;
};
Очевидно, что это повлияет на сериализацию каждого объекта в вашем коде и может привести к путанице при использовании нефильтрованных циклов for in
.«Правильным» способом было бы написать рекурсивную функцию, которая добавила бы функцию toJSON
на всех дочерних элементах любого данного объекта, имея дело с циклическими ссылками и тому подобным.Однако, принимая во внимание однопотоковый Javascript (без Web Workers), этот метод должен работать и не вызывать каких-либо непреднамеренных побочных эффектов.
Аналогичная функция должна быть добавлена в прототип массива для переопределения объекта путем возврата массива, а не объекта,Другой вариант - прикрепить один и позволить ему выборочно возвращать массив или объект в зависимости от собственной природы объектов, но, вероятно, он будет медленнее.
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