function Person (name) { this.name = String(name); } var obj = {name1: new Person('Ken'), name2: {name: 'Ken'}}; console.log(JSON.stringify(obj)); // "{"name1":{"name":"Ken"},"name2":{"name":"Ken"}}"
結局、JSONの問題点は克服できてないのだが あなたの頭の中がJSONに最適化されているからJSONにそぐわないコードを意識的に追い出しているに過ぎない - 関数が消されるが、使わないので問題ない - undefined は消されるが、undefined をプロパティ値に持たないので問題ない - new Date は String 型に変換されるが、後で new Date し直すので問題ない - new Arrayを除く全てのオブジェクトは new Object に変換されるが、オブジェクトおを「プロパティの塊」としかみないので問題ない - new Date(2016, 5, 14, 9, 0, 0) と "2016-06-14T00:00:00.000Z" が同値を認識されるが、データの塊としか見ないので問題ない - new function Person (name) { this.name = name; }('Ken') と {name: 'Ken'} が同値と認識されるが、オブジェクトを「プロパティの塊」としか見ないので問題ない