我了解可以从Java代码中调用此辅助方法,以检查您的Java / JS对象是否具有要查找的属性
但是我想知道当我们在JavaScript代码中使用此JSObject / AbstractJSObject实现时,Nashorn引擎是否调用了此方法。
我知道这样做的事实。 JavaScript内部将依次调用Java方法.getMember()
最佳答案
如果在JSObject实例的JavaScript(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in)中使用了“ in”运算符,Nashorn将在该JSObject上调用hasMember方法。
示例代码:
import javax.script.*;
import jdk.nashorn.api.scripting.*;
public class Main {
public static void main(String[] args) throws Exception {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine e = m.getEngineByName("nashorn");
e.put("obj", new AbstractJSObject() {
@Override
public boolean hasMember(String name) {
System.out.println("hasMember called for " + name);
return false;
}
});
// in operator triggers hasMember call on JSObject instance
e.eval("if ('foo' in obj) print('yes')");
}
}
上面程序的输出如下:
hasMember called for foo