Вызывая дочерний метод, определенный в parent, где 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.