Bueno, eso es sólo la forma en que está, JSON.stringify
no conserva ninguna de las no- propiedades propias del objeto. Puede echar un vistazo a una discusión interesante sobre otros inconvenientes y posibles soluciones here.
También tenga en cuenta que el autor no solo ha documentado los problemas, sino que también ha escrito una biblioteca llamada HydrateJS que podría ayudarlo.
El problema es un poco más profundo de lo que parece a primera vista. Incluso si a
realmente se aplica a {"position":0, "someVal":50}
, luego analizarlo más tarde crearía un objeto que tiene las propiedades deseadas, pero no es una instancia de Actor, ni tiene un prototipo de enlace al WorldObject (después de todo, el método de análisis no lo hace tener esta información, por lo que no puede restaurarla de esa manera).
Para preservar la cadena de prototipos, se necesitan trucos inteligentes (como los utilizados en HydrateJS). Si esto no es lo que pretendes, tal vez solo necesites "aplanar" el objeto antes de atarlo. Para hacer eso, podría, por ejemplo, iterar todas las propiedades del objeto, independientemente de si son propias o no y reasignarlas (esto asegurará que se definan en el objeto en sí en lugar de heredarse del prototipo).
function flatten(obj) {
var result = Object.create(obj);
for(var key in result) {
result[key] = result[key];
}
return result;
}
La forma en que se escribe la función no muta el objeto original. Así, utilizando
console.log(JSON.stringify(flatten(a)));
que obtendrá la salida que desea y a
seguirá siendo el mismo.
Creo que este código es básicamente lo que necesito. Debería poder guardar esta versión serializada y escribir un cargador simple. ¡Buen trabajo! – wtjones