Java Nashorn: абстрактный класс в JS возвращается к функции JS?

#javascript #java #nashorn

#javascript #java #nashorn

Вопрос:

Я создаю класс в JS, который затем должен иметь доступ к функциям из исходного JS. Однако в моих вариантах это немного сложнее, потому что имена функций — это просто «button_A_NUMBER», которые могут варьироваться от 0 до более 500. Я новичок в использовании JavaScript после простых изменений здесь и там на веб-странице, поэтому я не уверен, что я полностью здесь.

Я использовал этот [«button_» InterfaceID] (), который отлично работал, пока я не изменил его на класс вместо функции.

JS-файл 1

 function DecodedPacketButton(index) {
    var classObject = new DecodedPacket(index, 8, this) {
        complete: function(player, args) {
            try {
                var interfaceID = args[0];
                var childID = args[1];
                var slot1 = args[2];
                var slot2 = args[3];
                classObject.callMember("button_"   interfaceID, player,
                        classObject.index(), interfaceID, childID, slot1, slot2);
            } catch (e) {
                Logger.error(e);
            }
        }
    };
    return classObject;
}

function DecodedPacket121() {
    return DecodedPacketButton(0);
}  

JS-файл 2

 DecodedPacketButton.prototype.button_182
        = function(player, index, interfaceID, childID, slot1, slot2) { }  

Класс Java

 import jdk.nashorn.api.scripting.ScriptObjectMirror;

public abstract class DecodedPacket {
    private int index;
    private int size;
    private ScriptObjectMirror mirror;

    public DecodedPacket(int index, int size, ScriptObjectMirror mirror) {
        this.index = index;
        this.size = size;
        this.mirror = mirror;
    }

    public abstract void complete(Player p, Object... args);

    public void callMember(String functionName, Object... args) {
        mirror.callMember(functionName, args);
    }

    public void call(String functionName, Object... args) {
        mirror.call(functionName, args);
    }
}  

Я думал, что call или callMember будут тем, что я ищу, но, похоже, ни один из них не помогает.

Комментарии:

1. Итак, вы пытаетесь вызвать functioned на основе числа в их имени? НЕ ДЕЛАЙТЕ ЭТОГО. Если вам действительно нужно получить доступ к функциям по индексу, поместите их в список, индексируйте и вызывайте из списка.

Ответ №1:

Если вы хотите вызвать функцию по имени, самый простой способ — поместить их в литерал объекта.

 var funcs = {
  func1: function () { console.log('this is function 1') },
  func2: function () { console.log('this is function 2') }
};
                      
function callFunc(name) {
  if (funcs[name]) funcs[name]();
  else console.log('Function '   name   ' not found.');
}
                      
callFunc('func1');
callFunc('func2');
callFunc('func3');   

Комментарии:

1. Проблема в том, что у меня есть каждая функция button в собственном файле js, чтобы помочь упорядочить вещи и упростить управление, поскольку некоторые из них могут быть на большей стороне. Я также не уверен, как бы я поступил с callFunc вместо classObject.callMember в моем приведенном выше коде. Могу ли я напрямую ссылаться на функции в классе, который я создаю в js?

2. Пока вы можете ссылаться на функцию javascript, вы можете вызывать ее. если вы хотите вызвать элемент объекта по строке, это то же самое.. obj[somestring].somemethod(param1, param2 и т. Д.) ..

Ответ №2:

Я смог заставить свой исходный код работать как есть, просто сделав DecodedPacketButton возвращенным как новый DecodedPacketButton . Если кто-нибудь может объяснить мне необходимость нового и различия в его использовании или нет, я был бы признателен.