在JSObject,AbstractJSObject中覆盖hasMember()有什么用?

时间:2017-09-28 05:07:01

标签: javascript java nashorn

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

我知道这样做的事实。 JavaScript内部将依次调用Java方法.getMember()

1 个答案:

答案 0 :(得分:1)

如果在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