访问Nashorn类的原型链

时间:2019-06-13 04:43:43

标签: javascript java nashorn

我正在尝试通过Nashorn访问Javascript对象的原型链。我看到的不一致之处是在类与类实例的原型链中。 Nashorn原型似乎仅对实例对象有效,而对类本身无效。

以下代码演示了该问题:

res, err := buyerRepo.createAndSave(buyer)

在这里,我们正在记录实例对象import jdk.nashorn.api.scripting.NashornScriptEngine; import jdk.nashorn.api.scripting.ScriptObjectMirror; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class Main { private static String script = "function MyClass() {" + " this.nonProtoProp = 1;" + "}" + "MyClass.prototype.protoProp = 2;" + "myClass = new MyClass();"; public static void main(String[] args) throws ScriptException { NashornScriptEngine engine = (NashornScriptEngine) new ScriptEngineManager() .getEngineByName("nashorn"); engine.eval(script); ScriptObjectMirror som = (ScriptObjectMirror) engine.get("myClass"); String[] nonProtoKeys = som.getOwnKeys(true); ScriptObjectMirror proto = (ScriptObjectMirror) som.getProto(); String[] protoKeys = proto.getOwnKeys(true); System.out.println("Non-proto keys:"); for (String key : nonProtoKeys) System.out.println("\t" + key); System.out.println("Proto keys:"); for (String key : protoKeys) System.out.println("\t" + key); } } 的原型链。我们在“非原型键”列表中看到myClass,在“原型键”列表中看到nonProtoProp

但是,如果将protoProp分配给对象som,我会看到一堆默认的Javascript方法,例如MyClasstoString,但都没有的自定义属性显示在任一列表中。我显然希望length不存在,但是为什么不显示nonProtoProp?它不是任何一个实例的属性,而是类的属性。

一般来说,我对Javascript原型概念没有最强的了解,但是如果在Firefox控制台中执行此示例,确实会产生预期的结果(protoProp出现在protoProp的原型链中)。

注意:我知道nonProtoProp仍在原型中:)名称只是为了区分它们的分配/创建方式

0 个答案:

没有答案