0

我创建了一个实现 Graal ProxyObject 接口的 Java 类。hasMember(String key)我可以通过和方法访问该类的所有方法和属性getMember(String key)。但是如果我使用类似的东西

myObject[Symbol.iterator](); 

我得到一个例外:

org.graalvm.polyglot.PolyglotException: TypeError: myObject[(intermediate value).iterator] is not a function

问题是 myObject[Symbol.iterator] 返回未定义。如何通过 Symbol 访问我的代理对象的成员...?

4

2 回答 2

0

花了一些时间,但我自己解决了,基于基督徒回答的想法。库sj4js处理对象的使用Symbol.*并调用对象的适当方法。这是一个数组的例子。

JsArray hm = new JsArray("a","b","c");
        
try (JScriptEngine engine = new JScriptEngine()) {
    engine.addObject("test", hm);
            
    engine.exec("console.log([...test]);");
    // output a,b,c
} 
于 2021-03-10T06:32:03.150 回答
0

这在 Java 端是不可能的。Polyglot 互操作协议仅接受String密钥(例如,请参见getMember(String key)上面引用的内容),但Symbol.iterator它是一个 JavaScript Symbol。你需要以某种方式特例。这取决于您的 ProxyObject 做了什么——它最终是否委托给一个 JavaScript 对象,它知道什么Symbol.iterator是什么?然后你可以传入一些魔术字符串并适当地委托。

当前的 JavaScript 互操作代码总是返回undefined该模式interopObject[Symbol]。您甚至需要在打电话之前就发现这种情况myObject[Symbol.iterator],因为这永远不会到达您的ProxyObject.

//sketch of a solution on the JavaScript side
function read(obj, key) {
  if (key instanceof Symbol) {
    return obj[key.toString()]; //resulting in e.g. "Symbol(Symbol.iterator)"
  } else {
    return obj[key];
  }
}

//Java ProxyObject implementation: special-case the key "Symbol(Symbol.iterator)"

最好的,克里斯蒂安

于 2020-08-27T15:25:53.157 回答