Повторное связывание объекта с его классом после десериализации в Node.js
Я пишу простую платформу сериализации / десериализации для некоторых специфичных для приложения объектов.
Учтите следующее:
"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
На данный момент можно спросить "Что делаетd1
есть этоd2
не хватает?»
Один из подходов, который частично работает, состоит в том, чтобы вручную назначать методы от d1 до d2:
> d2.constructor = d1.constructor
> d2.getName = d1.getName
> d2.getName()
'fido'
Это имеет пару недостатков. Во-первых, я должен вручную назначить каждый метод от d1 до d2. Во-вторых, d2 получает свои собственные свойства и не разделяет слоты, используя механизм прототипа:
> d2
Dog {
_name: 'fido',
constructor: [Function: Dog],
getName: [Function] }
Итак, мой уточненный вопрос: дан объект (например,d2
), есть ли способ связать его с прототипом другого объекта (например,d1
) так что наследует такое же поведение?