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?