Javascript 在JSObject、AbstractJSObject中重写hasMember()有什么用?

Javascript 在JSObject、AbstractJSObject中重写hasMember()有什么用?,javascript,java,nashorn,Javascript,Java,Nashorn,我知道可以从Java代码中调用这个helper方法来检查Java/JS对象是否有您要查找的属性 但是我想知道当我们在JavaScript代码中使用这个JSObject/AbstractJSObject实现时,Nashorn引擎是否调用了它 我意识到这样一个事实:做一件事。内部JavaScript将依次调用Java方法。getMember()如果JSObject实例上的JavaScript()中使用了“in”操作符,Nashorn将调用该JSObject上的hasMember方法 示例代码: im

我知道可以从Java代码中调用这个helper方法来检查Java/JS对象是否有您要查找的属性 但是我想知道当我们在JavaScript代码中使用这个JSObject/AbstractJSObject实现时,Nashorn引擎是否调用了它

我意识到这样一个事实:做一件事。内部JavaScript将依次调用Java方法。getMember()

如果JSObject实例上的JavaScript()中使用了“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
如果在JSObject实例的JavaScript()中使用了“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