Java Nashorn: JS中的抽象类,依赖于JS函数

Java Nashorn: Abstract Class in JS falling back on JS function?

本文关键字:JS 依赖于 函数 抽象类 Nashorn Java      更新时间:2023-09-26

我在JS中创建一个类,然后需要能够从原始JS访问函数。但在我的选项中,这有点棘手,因为函数名称只是"button_A_NUMBER",范围从0到500以上。我刚开始使用JavaScript,过去在网页上进行简单的更改,所以我不确定我是否完全离开这里。

我使用这个["button_" + interfaceID](),它工作得很好,直到我把它改成一个类而不是一个函数。

JS文件

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文件

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将是我正在寻找的,但似乎都没有做到这一点。

如果要按名称调用函数,最简单的方法是将它们放在对象文字中。

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'); 

通过简单地将DecodedPacketButton作为新的DecodedPacketButton返回,我能够使我的原始代码按原样工作。如果有人能给我解释一下new的必要性以及使用和不使用的区别,我将不胜感激。