2015-12-21 5 views
7

Hier ist ein Beispiel, das das Problem veranschaulicht, zeigen sollen:=== false zurück in Nashorn, wenn beide Referenzen Ich bin vor auf das gleiche Objekt

ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine(
    new String[] { "-strict" } 
); 

try { 
    engine.eval("function Foo(src) { this.src = src }; var e = { x: new Foo(\"what\") };"); 

    ScriptContext c = new SimpleScriptContext(); 
    c.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); 
    c.getBindings(ScriptContext.ENGINE_SCOPE).putAll(engine.getBindings(ScriptContext.ENGINE_SCOPE)); 

    System.out.println(engine.eval("var z = e.x; z === e.x;", c)); 
} catch(Exception e) { 
    throw new RuntimeException(e); 
} 

Ich bin mir bewusst, dass Objekte, die in einem anderen Kontext instanziiert wurden , werden als "fremd" betrachtet und enden mit einer ScriptObjectMirror Instanz. Ich gehe davon aus, dass ich deswegen ein Problem habe. Ich glaube, wann immer x dereferenziert wird, wird eine neue ScriptObjectMirror Instanz erstellt; das ist das einzige, was das folgende Stück Code erklären kann auch false Rückkehr:

System.out.println(engine.eval("e.x === e.x;", c)); 

Gibt es eine Möglichkeit, um dieses? Ich suche nach etwas, was ich von Java aus tun kann, um Kontexte/Bindungen auf eine bestimmte Weise einzurichten, anstatt Code in JavaScript schreiben zu müssen, um das zu umgehen.

Antwort

0

Nicht sicher, ob Sie das Dokument hier gesehen haben: (https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes), aber falls Ihre Annahme korrekt ist, könnten Sie 'Explizites Skriptobjekt spiegeln' verwenden, um das Problem zu vermeiden.

+0

JavaScript-Objekte eingewickelt werden, wenn man sie übergeben in einen fremden Kontext, aber das Problem hier ist, dass '===' in Nashorn scheint, die Wrapper-Instanzen und nicht die tatsächlichen, eingewickelten Objekte zu vergleichen. Wenn es sieht, dass es sich um eine 'ScriptObjectMirror'-Instanz handelt, sollte sie vor dem Vergleich von IMO ausgepackt werden. Es sei denn, etwas fehlt mir. –