Aufruf von @JSFunction von JavaScript, TypeError: Der Standardwert für das Objekt konnte nicht gefunden werden

8

Ich rufe eine @JSFunction annotierte Methode eines ScriptableObject

auf

Die JavaScript-Datei

%Vor%

Die Java-Datei

%Vor%

Aber ich bekomme

%Vor%

und ich weiß nicht, wo ich hingehen soll. Wenn ich nicht addModifier method aufruft, funktioniert der angegebene Code, und angesichts des Fehlers notFunctionError down im Stack-Trace denke ich, dass Rhino die angegebene Methode nicht als JavaScript-Funktion interpretiert.

  • OSX 10.8.2
  • Java 7
  • Rhino 1.7R4

Komplettes Maven-Projekt, das den Fehler reproduziert, finden Sie hier

    
oschrenk 28.01.2013, 12:16
quelle

2 Antworten

3

tl; dr siehe diese zwei Alternativen.

Das Problem mit dem obigen Ansatz ist, dass Target.prototype im Skriptbereich nicht richtig eingerichtet ist. Weitere Informationen finden Sie in der statischen Methode ScriptableObject.defineClass() Details zur korrekten Definition von Prototypen in einem Skriptumfang.

Sie haben mehrere Möglichkeiten, Ihren Skripten den Konstruktor Target bereitzustellen. Die erste Alternative würde immer den Target -Konstruktor für alle Skripte definieren. Dies funktioniert gut, wenn Sie im Voraus wissen, dass Target global verfügbar sein soll. Das kommt im Wesentlichen auf Folgendes an:

%Vor%

Wenn der Skriptautor stattdessen entscheiden soll, welche Konstruktoren erforderlich sind, wird die zweite Alternative verwendet Stellen Sie die defineClass -Funktion für Skripts bereit. Mit dieser Funktion können Skriptautoren beliebige skriptfähige Objekte auf ihrem Klassenpfad "importieren" (was möglicherweise mehr ist, als Sie zulassen möchten). Um die Funktionen defineClass für Skripts bereitzustellen, führen Sie nach dem Eingeben des Kontexts Folgendes aus:

%Vor%

Und dann verwendet der JavaScript-Autor den Target -Konstruktor wie folgt:

%Vor%

In beiden obigen Zweigen habe ich noch ein paar andere Änderungen vorgenommen, die Sie besser einrichten, wenn Sie dem Konstruktor Target mehr hinzufügen. Der Nullargumentkonstruktor benötigt nicht die Annotation @JSConstructor . Wenn Sie später einen Konstruktor haben möchten, der Argumente akzeptiert, wird dieser Nullargumentkonstruktor als Prototypkonstruktor verwendet, und Sie können die Annotation @JSConstructor für eine Methode verwenden, die zum Initialisieren Ihres Objekts verwendet wird. Je nachdem, wie Sie diese Konstruktormethode erstellen, wird es wichtig, das Schlüsselwort new in Ihrem JavaScript zu verwenden.

Kurz gesagt, die Packages.com.acme... -Syntax ist nicht nützlich, um Zugriff auf ScriptableObject -Konstruktoren von Skripten zu erhalten.

    
Tim Schaub 29.01.2013, 17:34
quelle
0

Ich bekomme es (sehr ähnlichen Code) mit dem neuen Operator. In deinem Beispiel macht das

%Vor%

sollte auch funktionieren.

    
elxala 26.09.2016 20:42
quelle

Tags und Links