在子节点上调用父节点中定义的方法(其中parent是宿主对象),在不兼容对象上调用EcmaError:方法。
Java中定义的主机对象:
public class HostObject extends ScriptableObject {
public HostObject() {}
@Override
public String getClassName() {
return "HostObject";
}
public void jsFunction_sayHi() {
System.out.println("Hi!");
}
}
测试脚本#1在Rhino中运行:
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)然后明确每当我需要访问成员时使用原型:
HostObject ho = (HostObject)thisObj.getPrototype();
有些情况是在原始对象上调用sayHi()
然后getPrototype()
引用Javascript对象,所以我需要执行额外的检查以使这两种情况都能正常工作。我会认为,使用原型链接原始示例应该可以正常工作。这是一个可能的错误吗?或者我做错了什么?
我正在使用Rhino 1.7R2。
答案 0 :(得分:2)
而不是使用:
HostObject ho = (HostObject)thisObj.getPrototype();
使用类似的东西:
Scriptable obj = thisObj;
while(obj != null && !(obj instanceof HostObject)) {
obj = obj.getPrototype();
}
HostObject ho = (HostObject)ho;
这将在原型链中找到正确的原型。