これを処理する方法はいくつかありますが、WinJS にとって特に特別なものはありません。簡単に言えば、JSON シリアライゼーションはオブジェクトの値のみをシリアライズおよびデシリアライズし、メソッド、プロトタイプ、またはその他の型情報はシリアライズおよびデシリアライズしません。
オプション 1: 値をクラスの新しいインスタンスにコピーする
これは通常、コンストラクターに逆シリアル化されたオブジェクトをパラメーターとして取り、データを新しいインスタンスにコピーすることで実現できます。
これにはさまざまなバリエーションがあります。通常、オブジェクト コンストラクターを使用すると、JS エンジンがより多くの最適化をオブジェクトに適用できるため、パフォーマンスが向上します。
ここでは WinJS.UI.setOptions が役立ちます。または、次のような単純なループを使用してデータをコピーすることもできます。
var keys = Object.keys(source);
for (var i = 0, len = keys.length; i < len; i++) {
var key = keys[i];
destination[key] = source[key];
}
オプション 2: __proto__ の設定
警告: これはパフォーマンスに重大な悪影響を与える可能性があるため、状況によっては適切ではありません。でもたまには便利かも。
Object.setPrototypeOf(myObject, myClass.prototype);
setPrototypeOf は比較的新しいことに注意してください。Webアプリ用のWin8.1(これについてだと思います)とIE 11にはありますが、たとえばSafariでは利用できません。古いブラウザー/Safari では、 protoへの割り当ては同等です (ただし、可能な場合は setPrototypeOf の方が優れています)。
これにより、myClass のメソッドがオブジェクトにアタッチされますが、パフォーマンスへの悪影響に加えて、オブジェクトでコンストラクターが実行されないため、最初にシリアル化したオブジェクトとまったく同じ状態にならない可能性があります。
その他の役立つこと: JSON の「リバイバー」
JSON.parse は、「リバイバー」と呼ばれるオプションの 2 番目のパラメーターを取ります。これにより、逆シリアル化される JSON の各ノードを変換する機会を得る関数を提供できます。これは、たとえば、シリアル化された日付を JavaScript の Date オブジェクトにリハイドレートするのに役立ちます。また、最上位のオブジェクトを変換する機会も得られます。これは、場合によっては、逆シリアル化されたオブジェクトを必要な「クラス」に変換するのに役立ちます。