2016-10-05 2 views
0

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

Я использовал этот ["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); 
 
    } 
 
}

Я думал, что вызов или callMember будет тем, что я ищу, но, похоже, это не трюк.

+0

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

ответ

0

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

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

+0

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

+0

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

0

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