Вызов для дочернего элемента метода, определенного в родительском, где родительский объект является объектом хоста, дает 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.