我正在尝试通过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方法,例如MyClass
和toString
,但都没有的自定义属性显示在任一列表中。我显然希望length
不存在,但是为什么不显示nonProtoProp
?它不是任何一个实例的属性,而是类的属性。
一般来说,我对Javascript原型概念没有最强的了解,但是如果在Firefox控制台中执行此示例,确实会产生预期的结果(protoProp
出现在protoProp
的原型链中)。
注意:我知道nonProtoProp仍在原型中:)名称只是为了区分它们的分配/创建方式