使用symbol.iterator访问proxyobject的迭代器

x8goxv8g  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(436)

我创建了一个java类来实现graal proxyobject接口。我可以通过访问该类的所有方法和属性 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]返回未定义的。如何通过符号…访问代理对象的成员。。。?

lmvvr0a8

lmvvr0a81#

这在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)"

最好的,克里斯蒂安

相关问题