Rhino: Прототипная цепочка не работает для хост-объектов? - PullRequest
1 голос
/ 25 октября 2010

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

1 Ответ

2 голосов
/ 14 декабря 2010

Вместо использования:

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

используйте что-то вроде:

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

Это позволит найти правильный прототип в цепочке прототипов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...