假设java中有foo.class:
public class Foo {
public int id;
public String data;
}
我在javascript中有foo“class”:
function Foo(id, data) {
this.id = id;
this.data = data;
}
另外,假设我有一个java控制器,它返回foo.class的示例作为对rest请求的响应。在我的javascript(angularjs)代码中,请求被发送为:
$http.get(url + 'bar/get-foo/')
.success(function (response) {
var foo = new Foo(response.id, response.data);
logger.info("SUCCESS: /get-foo");
})
.error(function (error_message) {
logger.error(error_message)
});
而且很有效。但是有没有一种方法可以避免将响应中的每个属性传递给foo构造函数(某种程度上需要foo对象,或者将其强制转换为foo对象)?
我试过用 Object.create(Foo, response)
但我明白了 TypeError: Property description must be an object: true
当然,总是有可能将javascript端foo构造函数重构为:
function Foo(foo) {
this.id = foo.id;
this.data = foo.data;
}
但是,这需要重构大部分代码库。
谢谢你的时间。我很感激!
ps:对于那些想知道为什么我需要这个的人来说:对于像foo这样的小班来说,这不是问题,但是一些响应是一个更大的类(有十几个字段)的示例,它们不在我的控制之下。
编辑:我接受了chichozell的答案,仅仅是因为它需要最少的工作量。robin和jonnyknowsbest的答案也很有效(而且适用于纯javascript,不像chichozell的答案,后者是特定于angularjs的)。我还没试过劳伦提的答案,但看起来应该也有用。无论如何,这是一个解决方案(不是解决方案):
.success(function (response) {
var foo = new Foo();
angular.extend(foo, response); // angular.merge() for "deep-copy"
//...
}
非常感谢所有在这篇文章中回答/评论/编辑的人。
4条答案
按热度按时间hpcdzsge1#
如果您想让java继续使用javascript,请尝试使用angular.extend(),它会将一个对象的属性“复制”到另一个对象
在foo函数中,或直接在控制器上:
sf6xfgos2#
您可以这样做来“反序列化”作为对初始化对象的响应而收到的json:
这假设构造函数存在于全局范围中,并且响应是json格式的:
t5fffqht3#
如果你想的话,你可以把它做得很普通。而且不会有太多的重构要做,这个解决方案将减轻您将来对这两个类的更改。
您可以将foo javascript对象更改为angular js服务,并在需要时将其注入到任何地方。这样,您就可以在全球范围内获得数据。它比局部变量foo好。
您还可以使用hasallproperties之类的方法(通过遍历对象的属性,不管它是数组还是对象),使创建新服务更安全;hasNullValue等等。
希望这有帮助,你看到它的价值。
uhry853o4#
您还可以执行类似于jsfiddle的操作来实现所描述的结构。createobject函数看起来像下面的代码段。
其中createobject将具有与函数相同属性的js对象作为响应参数,将函数(要创建的对象)作为tocreate参数。
查看jsfiddle控制台日志输出,您会发现它是有效的。
您还可以从jsfiddle中看到,删除对hasownproperty的检查,以设置响应中的所有属性,而不管javascript函数是否定义了这些属性。