java - Rhino:原型(prototype)链接不适用于宿主对象?

标签 java javascript rhino

在子对象上调用在父对象中定义的方法,其中父对象是宿主对象,会产生 EcmaError:在不兼容对象上调用的方法。

Java 中定义的宿主对象:

public class HostObject extends ScriptableObject {            

    public HostObject() {}

    @Override
    public String getClassName() {
        return "HostObject";
    }

    public void jsFunction_sayHi() { 
        System.out.println("Hi!");
    }
}

在 Rhino 中运行的测试脚本#1:

var foo = new HostObject();
foo.sayHi();

工作正常。

测试脚本#2:

function Bar() {}
Bar.prototype = new HostObject();
var bar = new Bar();
bar.sayHi();

抛出异常:

org.mozilla.javascript.EcmaError: TypeError: 方法“sayHi”调用了不兼容的对象。

找到了解决这个问题的方法(有点......) - 通过使用另一种定义方法的形式 - 带有参数的静态方法(Context cx,Scriptable thisObj,Object [] args,Function funObj)然后显式每当我需要访问成员时使用原型(prototype):

HostObject ho = (HostObject)thisObj.getPrototype();

在某些情况下,sayHi() 在原始对象上被调用,然后 getPrototype() 引用 Javascript 对象,所以我需要执行额外的操作在这两种情况下检查以使其工作。我原以为通过原型(prototype)链接,原始示例应该可以正常工作。这可能是一个错误吗?还是我做错了什么?

我使用的是 Rhino 1.7R2。

最佳答案

而不是使用:

HostObject ho = (HostObject)thisObj.getPrototype();

使用类似的东西:

Scriptable obj = thisObj;
while(obj != null && !(obj instanceof HostObject)) {
    obj = obj.getPrototype();
}
HostObject ho = (HostObject)ho;

这将在原型(prototype)链中找到正确的原型(prototype)。

关于java - Rhino:原型(prototype)链接不适用于宿主对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4014299/

相关文章:

javascript - 自定义单选 Div/图像/按钮

javascript - 有 Rhino 预加载脚本吗?

java - eclipse 露娜 - "No projects are found to import"

javascript - 使用 javascript 将 yaml 转换为 json

java - 无法启动 Zookeeper 服务器。没有jdk目录

javascript - 如何仅在首次登录时显示弹出窗口

java - ArrayList<Integer> 上的 indexOf 函数在 JSR 223(Rhino 脚本引擎)中不起作用

javascript - 在 Rhino 中加载当前文件的相对路径上的文件

java - Eclipse 插件 - TreeViewer 显示大量文本

java - C# 数据到 Java