Rhino:Prototype链接不适用于宿主对象?

时间:2010-10-25 12:00:19

标签: java javascript rhino

在子节点上调用父节点中定义的方法(其中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。

1 个答案:

答案 0 :(得分:2)

而不是使用:

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

使用类似的东西:

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

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