在子对象上调用在父对象中定义的方法,其中父对象是宿主对象,会产生 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/