Vuelva a asociar un objeto con su clase después de la deserialización en Node.js

Estoy escribiendo un marco simple de serialización / deserialización para algunos objetos específicos de la aplicación.

Considera lo siguiente:

"use strict";
function Dog(name) { this._name = name; };
Dog.prototype.constructor = Dog;
Dog.prototype.getName = function() { return this._name; }

var d1 = new Dog('fido');
var d2 = JSON.parse(JSON.stringify(d1));  // serialize / deserialize

> d1
Dog { _name: 'fido' }
> d1.getName()
'fido'
> d2
{ _name: 'fido' }
> d2.getName()
TypeError: d2.getName is not a function

En este punto, uno puede preguntar "¿Qué significad1 tengo esod2 falta?

Un enfoque que funciona parcialmente es asignar manualmente los métodos de d1 a d2:

> d2.constructor = d1.constructor
> d2.getName = d1.getName
> d2.getName()
'fido'

Esto tiene un par de desventajas. Primero, tengo que asignar manualmente cada método de d1 a d2. En segundo lugar, d2 tiene sus propias propiedades y no comparte ranuras utilizando el mecanismo prototipo:

> d2
Dog {
   _name: 'fido',
  constructor: [Function: Dog],
  getName: [Function] }

Entonces mi pregunta refinada es: dado un objeto (p. Ej.d2), ¿hay alguna forma de asociarlo con el prototipo de otro objeto (p. ej.d1) ¿Entonces hereda el mismo comportamiento?

Respuestas a la pregunta(2)

Su respuesta a la pregunta