pofigizm
@pofigizm

Как передать с сервера (node.js) объект вместе с методами (function)?

На сервере (node.js) создал объект, у которого есть поля и метод (function).

Отправляю в виде JSON этот объект в браузер. В браузере получаю объект состоящий только из данных. Моего метода в нем уже нету. Собственно вопрос как получить объект с методом(и)?

Куда запостить пример с нодой я не знаю, поэтому просто положил на github.

Там два файла server.js и index.html.
Скачиваете в любую папку и в командной строке набираете node server.
Затем открываете в браузере адрес: 127.0.0.1.
После нажатия на ссылку в консоле мой Объект и TypeError.

https://github.com/Pofigizm/nodejs-send-object-exa...

+++ UPD

Сделал через конструктор Function (спасибо Денис Пушкарев) . Почти то что хотелось, но надо писать методы в виде текстов, с чем не очень удобно работать.
https://github.com/Pofigizm/nodejs-send-object-exa...
  • Вопрос задан
  • 5384 просмотра
Решения вопроса 2
JSON формат обмена данными, а не кодом и поддерживает только примитивы, Object и Array, но никак не функции. Хотите передать код? Подключите его как скрипт или передайте как текстовые данные и исполните через конструктор Function или eval.
Ответ написан
pofigizm
@pofigizm Автор вопроса
Правильный вариант получить на сервере и на клиенте одинаковые объекты с одинаковыми методами без двойного кода - это описать класс в отдельном файле и подключать его и на сервер и на клиенте. Единственное в чем была проблема (для меня) это как "назначить классы" объектам распарсенных из 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);
...

Полные варианты файлов можно скачать на гитхабе в новой ветке.

Интересно послушать комментарии насчет такой реализации.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Не совсем понимаю, зачем Вам получать с сервера методы? Возможно, Вам нужно нечто другое? Возможно вы будете заинтересованы в шаблонизаторах типа ejs.
Тут работает такая система. Вы подключаете систему шаблонизации, описываете шаблону, а сервером не отдаете команду res.render('название шаблона', {объемный объект}). Далее в шаблоне вы уже можете свободно обращаться к методам и свойствам переданного объекта.
Но, само собой, этот метод "отрисует" страницу лишь один раз, после отдачи пользователю для браузерного javascript, конечно, объект, в его классическом представлении, будет недоступен.
Если же Вам нужно все-таки получить с сервера объект с методами - удобнее json придумать что-то сложно. Правда, Вам придется все методы собрать в функции из строк, как писал предыдущий комментатор. Объект.метод = new Function ([аргументы], "тело метода").
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы