Правильный вариант получить на сервере и на клиенте одинаковые объекты с одинаковыми методами без двойного кода - это описать класс в отдельном файле и подключать его и на сервер и на клиенте. Единственное в чем была проблема (для меня) это как "назначить классы" объектам распарсенных из json. Назначать методы глобальному Object (т.к. он является прототипом объектов из JSON.parse()) не очень хотелось. Собственно код:
Часть файла object.js
...
function Order(object) {
object.parts = object.parts || [];
var partsArr = [];
object.parts.forEach(function (value, key) {
partsArr[key] = new Order(value);
});
this.name = object.name || 'Default';
this.cost = object.cost || 0;
this.parts = partsArr;
}
Order.prototype.summ = function() {
var summ = 0;
this.parts.forEach(function(part) {
summ += part.summ();
});
return summ + this.cost;
};
...
подключаем на сервере и используем:
...
var Order = require('./order')
var myobject = new Order({name:'my object', cost: 10});
myobject.parts[0] = new Order({name:'my first part', cost: 20});
myobject.parts[1] = new Order({name:'my second part', cost: 30});
myobject.parts[1].parts[0] = new Order({name:'my first in second part', cost: 40});
...
подключаем на клиенте и используем:
...
<script src='order.js'></script> // здесь теги
...
var xhrobj = JSON.parse(this.responseText);
var myobject = new Order(xhrobj);
...
Полные варианты файлов можно скачать на гитхабе в новой ветке.
Интересно послушать комментарии насчет такой реализации.