手早く汚れた方法は次のようになります。
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 ワーカーなし) を想定すると、このメソッドは機能し、意図しない副作用は発生しません。
同様の関数を 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