重写JSObject、AbstractJSObject内部的hasMember()有什么用?
What is the use of overriding hasMember() inside JSObject, AbstractJSObject?
我知道可以从 Java 代码调用此辅助方法来检查您的 Java/JS 对象是否有您正在寻找的 属性
但是 我想知道当我们在 JavaScript[=16] 中使用这个 JSObject/AbstractJSObject 实现时 Nashorn 引擎是否调用了它=]代码。
我知道做一个 .在 Java 脚本中将依次调用 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
我知道可以从 Java 代码调用此辅助方法来检查您的 Java/JS 对象是否有您正在寻找的 属性 但是 我想知道当我们在 JavaScript[=16] 中使用这个 JSObject/AbstractJSObject 实现时 Nashorn 引擎是否调用了它=]代码。
我知道做一个 .在 Java 脚本中将依次调用 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