Rhino: Цепочка прототипов не работает для хост-объектов?

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