一种快速而肮脏的方式是这样的:
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
显然,这会影响代码中每个对象的序列化,并且可能会使用未过滤的循环使 naive 代码绊倒。“正确”的方法是编写一个递归函数,将toJSON
函数添加到任何给定对象的所有后代成员上,处理循环引用等。然而,假设单线程 Javascript(没有 Web Workers),这个方法应该可以工作并且不会产生任何意外的副作用。
必须将类似的函数添加到 Array 的原型中,以通过返回数组而不是对象来覆盖 Object 的。另一种选择是附加一个,让它根据对象自身的性质有选择地返回一个数组或一个对象,但它可能会更慢。
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/yermateno/2/edit