Associando novamente um objeto à sua classe após a desserialização no Node.js

Estou escrevendo uma estrutura simples de serialização / desserialização para alguns objetos específicos de aplicativos.

Considere o seguinte:

"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

Neste ponto, pode-se perguntar "O que fazd1 tem issod2 falta? "

Uma abordagem que funciona parcialmente é atribuir manualmente os métodos de d1 a d2:

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

Isso tem algumas desvantagens. Primeiro, tenho que atribuir manualmente cada método de d1 a d2. Segundo, o d2 obtém suas próprias propriedades e não compartilha slots usando o mecanismo de protótipo:

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

Portanto, minha pergunta refinada é: dado um objeto (por exemplo,d2), existe uma maneira de associá-lo ao protótipo de outro objeto (por exemplo,d1) para herdar o mesmo comportamento?

questionAnswers(2)

yourAnswerToTheQuestion