重写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