我在服务器(node.js)上有对象whith方法(函数)。 我想在浏览器中使用方法获取此对象。
有可能吗?
I made simple example on GitHub
有server.js和index.html文件。运行 - >节点服务器。
+++++++++ + UPD (评论后)
我在服务器上的对象:
function ClassOrder(name, cost) {
this.name = name;
this.cost = cost;
this.parts = [];
this.summ = function() {
var summ = 0;
this.parts.forEach(function(part) {
summ += part.summ();
});
return summ + this.cost;
};
}
var myobject = new ClassOrder('my object', 10);
myobject.parts[0] = new ClassOrder('my first part', 20);
myobject.parts[1] = new ClassOrder('my second part', 30);
myobject.parts[1].parts[0] = new ClassOrder('my first in second part', 40);
console.log(myobject); // view myobject in console
console.log(myobject.summ()); // return 100 (10+20+30+40)
发送给客户(根据要求)
res.end(JSON.stringify(myobject));
并在客户端的javascript代码(在浏览器中)获取
function getobject() {
var xhr = new XMLHttpRequest();
xhr.open('get', '/getobject', true);
xhr.onreadystatechange = function() {
if (xhr.readyState != 4) return;
var myobject = JSON.parse(this.responseText);
console.log(myobject); // all data ok
console.log(myobject.summ()); // no methods!!
};
xhr.send(null);
}
这是一个简单的例子,实际上我使用原型(或继承在util(node.js))。 我在服务器上使用此方法并将其保存在DB中。一切正常。 但如果我不在客户端使用它,我需要复制粘贴所有方法,为什么?
此外,我不知道如何将我的示例方法添加到客户端中的对象而不进行反汇编。
答案 0 :(得分:0)
问题是:如何使用没有双重编码的方法来获取服务器和客户端相同的对象。
有两种方法可以做到。
第一种方式是将我的方法(函数)转换为文本并将其与对象一起保存。然后我们可以使用Function构造函数来运行它。
function ClassOrder(name, cost) {
this.name = name;
this.cost = cost;
this.parts = [];
this.summfunc = '\
var summ=0; \
obj.parts.forEach(function(part) { \
summ += part.summ(); \
}); \
return summ + obj.cost;';
}
ClassOrder.prototype.summ = function() {
return (new Function('obj', this.summfunc))(this);
};
可以在浏览器中使用
var myobject = JSON.parse(this.responseText);
myobject.constructor.prototype.summ = function() {
return (new Function('obj', this.summfunc))(this);
};
Link to commit on new branch on GItHub
这种方式很糟糕,因为我需要将所有方法转换为文本。如何说@Felix Kling让代码更难维护和跟踪。
第二种方式是在服务器和客户端上使用一个包含类和方法的文件。并且在收到数据后“转换”给我的班级。
我的班级文件order.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;
};
需要order.js并更改调用new Object的参数:
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);
Link to commit on other branch on GItHub
我认为这种方式首先要好一些。
答案 1 :(得分:-1)
我认为答案就在那里:Calling a JavaScript function returned from an Ajax response
但似乎没有必要将答案放在脚本标签中,试试这个:
eval(this.responseText)