2016-03-16 4 views
11

Dies entspricht der Frage "Capturing Nashorn's Global Variables". Ich finde es sehr einschränkend, die Zuordnung von Variablen zum globalen Objekt nicht abfangen zu können.Auf globale Nashorn-Objektvariablen zugreifen/abfangen

Sagen Sie zum Beispiel, dass ich das Skript "a = 10" auswerte. Vielleicht möchte ich einen Listener anrufen, um etwas zu benachrichtigen, dass 'a' zum Bereich hinzugefügt wurde. Die einzige Möglichkeit, dies zu tun, besteht darin, das globale Objekt zu untersuchen, nachdem das Skript evaluiert wurde.

Oder sagen, ich möchte ein Objekt abfangen, das dem globalen Geltungsbereich zugewiesen ist, und es durch einen anderen ersetzen; wenn es Bindings wurde mit konnte ich umsetzen put und delegieren zu einigen anderen Bindungen aus:

public Object put(String name, Object value) { 
    //put a toStringed version of the object in scope 
    return delegate.put(name, value+""); 
} 

Auf diese Weise, wenn der Code ‚a = 10‘ evalled ist, wäre es „10“ in Rahmen setzen statt 10 .

Es ist praktisch, eine Bindings Schnittstelle zu implementieren, aber frustrierend, dass ich etwas wie diese Implementierung für das globale Objekt nicht bereitstellen kann. ScriptObjectMirror ist endgültig, also kann ich dies nicht einmal überlasten und den nachfolgenden Aufruf zum internen ScriptObject übernehmen. Fehle ich etwas?

Antwort

0

Also im Grunde, was Sie tun möchten, ist das Abfangen/Zuweisen von Zuweisungen an beliebige Eigenschaften auf einem Objekt. In Ihrem Fall das globale Objekt.

Afaik, das war nie wirklich möglich ohne irgendeinen hübschen Hacky-Code. Eine Suche nach "Observables Javascript" könnte Ihnen dabei helfen, aber seien Sie gewarnt, dass Sie in eine schmutzige Gegend geraten.

Wenn dies zum Testen gedacht ist (im Gegensatz zum Produktionscode), ist ein setTimeout/setInterval mit einem Listener, der regelmäßig alle Eigenschaften des globalen Objekts auflistet und eine Warnung protokolliert, falls eine hinzugefügt wurde, gut genug für Sie.

In Zukunft werden wir den Javascript Proxy Standard haben, um uns dabei zu helfen, aber ich bezweifle ernsthaft, dass es dort noch in Nashorn ist. Es ist schon eine Weile her, seit ich mit Nashorn zusammengearbeitet habe, aber nach dem ersten Ausbruch auf der Szene war es still an der Nashorn-Frontblende ...