有没有办法在JavaScript代码中"期望"某些Java类的实例?

zkr*_*tic 8 javascript java casting angularjs

假设我在Java中有Foo.class:

public class Foo {
    public int id;
    public String data;
}
Run Code Online (Sandbox Code Playgroud)

而且我在JavaScript中有Foo"class":

function Foo(id, data) {
    this.id = id;
    this.data = data;
}
Run Code Online (Sandbox Code Playgroud)

另外,假设我有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)
    });
Run Code Online (Sandbox Code Playgroud)

它有效.但有没有办法避免将每个属性从响应传递到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;
}
Run Code Online (Sandbox Code Playgroud)

但是,这需要重构大部分代码库.

谢谢你的时间.我很感激!

PS:对于那些想知道为什么我需要这个的人:对于像Foo这样的小类来说这不是问题,但是一些响应是更大类(具有十几个字段)的实例,这些不在我的控制之下.

编辑:我接受Chichozell的答案只是因为它需要的工作量最少.Robin和jonnyknowsbest的答案也有效,(并且适用于纯JavaScript,不像Chichozell的答案,这是AngularJS特有的).没有试过Laurentiu L.的答案,但看起来它也应该有效.无论如何这是一个解决方案(不是解决方案):

.success(function (response) {
    var foo = new Foo();
    angular.extend(foo, response); // angular.merge() for "deep-copy"
    //...
}
Run Code Online (Sandbox Code Playgroud)

非常感谢在此主题中回答/评论/编辑过的所有人.

小智 1

如果你想让你的 Java 思维停留在 javascript 上,请尝试使用 angular.extend(),它会将一个对象的属性“复制”到另一个对象

this = angular.extend(this, response)
Run Code Online (Sandbox Code Playgroud)

在 foo 函数中,或直接在控制器上:

 Foo = angular.extend(Foo, response)
Run Code Online (Sandbox Code Playgroud)