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.
Ich akzeptiere dies als Antwort, da Sundar in der Mailingliste eine gute Erklärung für dieses Verhalten gegeben hat. –