クロムのネイティブ JSON.stringify を使用して、非常に複雑なデータ構造をシリアル化しています (クロスブラウザーのサポートのために、後でいくつかのシリアル化ライブラリに切り替えます)。ほとんどのデータは静的と見なすことができますが、一部は動的です。
データを構築するとき、次のようなことができるようにしたい
var dynamicString=new String();
{a:"foo", b:dynamicString}
次に、後で dynamicString のプリミティブ文字列値を設定します。そのオブジェクトのプロパティ「b」を変更するのではなく、これを行いたいと思います。これにより、このデータをより簡単に構築できるからです。つまり、次のようなものです。
String オブジェクトのプリミティブ値を変更できないことは既にわかっています。また、valueOf-function をカスタム関数に設定できることもわかりました。その関数で目的の値を返すことで、次のようなことを行うと基本的に実現できます。
var dynamicString=new String("bar");
a.valueOf=function(){return ("foo")};
alert (a+"bar");//foobar
問題は、シリアライゼーションが明らかに valueOf 関数を使用していないことです。この場合、dynamicString オブジェクトをシリアライズすると、JSON.stringify によって返される文字列に、必要な「foo」ではなく「bar」が挿入されます。
私が求めているものを取得する 1 つの方法は、シリアル化の前にデータ構造のすべてのオブジェクトを再帰的にループし、動的データ オブジェクトをそれらが返すプリミティブ値に置き換えることです。でも、できれば避けたいですよね。
助言がありますか?
編集:もちろん、私も参照しているオブジェクトをデータに入れることもできます。次に、そのオブジェクトのデータを「動的に」設定できます。これは結果文字列に反映されます。しかし、それは構造に別のレベルを追加します。文字列プロパティを持つオブジェクトではなく、文字列が必要です。