2016-10-05 13 views
0

私はJSでクラスを作成していますが、それは元のJSから関数にアクセスできる必要があります。関数名は0〜500を超える "button_A_NUMBER"なので、私のオプションではちょっと難しいです。私はJavaScriptを使ってWebページ上の単純な変更を行っていたので初めてです。私がここから完全に離れているかどうか確かめてください。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); 
 
    } 
 
}

私はcallまたはcallMemberが私が探しているものだと思ったが、いずれもそのトリックをしていないようだ。

+0

だから、あなたの名前の数字に基づいてfunctionedを呼び出そうとしていますか?それをしないでください。索引で関数にアクセスする必要が本当に必要な場合は、それらをリストに入れ、索引付けしてリストから呼び出します。 – 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ファイルに各ボタンの機能を持たせることで、ソートされて管理しやすくなります。私はまた、上記のコードでclassObject.callMemberの代わりにcallFuncをどうやって使うのかよく分かりません。 jsで作成したクラスの関数を直接参照できますか? – PalidinoDH

+0

javascript関数を参照できる限り、それを呼び出すことができます。文字列でオブジェクトのメンバーを呼びたい場合は、同じことです。obj [somestring] .somemethod(param1、param2、etc.).. – Keith

0

単にDecodedPacketButtonは、代わりに新しいDecodedPacketButtonとして返させることによって-であるように私は私の元のコードが動作して取得することができました。誰かが私に新しいことの必要性とそれを使用するかどうかの違いを説明することができれば、私はそれを感謝します。

関連する問題