2018-5-14 by MartinDelophy
前不久,在github不小心看到了一个node-jvm 不由得惊叹,node竟然也能写出jvm,故clone了一波来看看到底是何方神圣。 地址:https://github.com/YaroslavGaponov/node-jvm
首先那肯定是看一下官方案例的,官方主要是用fibonacci.js 来new了一个jvm,然后设定日志等级,载入class文件,设定异步事件,就开始执行了。感觉很ok
那么,我们先看看它jvm地方的源码吧,首先,看到的是这句话,无用的代码暂时省略
var JVM = module.exports = function() { if (this instanceof JVM) { JVM.super_.call(this); THREADS.add(new Thread("main")); this.entryPoint = { className: null, methodName: "main" }; } else { return new JVM(); } }
代码很直观,我们可以看到一开始,如果该对象是通过jvm new出来的对象就进行入 JVM.super_.call这句话中,如果不是则 new 一下返回。
这几个地方还是比较容易理解的,除了这句 JVM.super.call,我翻遍了代码,但是却没有找到这个super 方法,那么这个super_ 方法是哪里来的呢? 幸运的是,另外一句话也同样引起了我的注意
var util = require("util"); var EE = require("events").EventEmitter; util.inherits(JVM, EE);
util.inherits指的是将 require("events").EventEmitter 方法继承到JVM中,那么super_ 从哪里来的呢,我们还是不知道,通过 这篇blog的帮助(https://www.cnblogs.com/youlechang123/p/5602335.html),我们看到了一段代码
exports.inherits = function(ctor, superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); };
这下,我恍然大悟,原来JVM.super_ 不仅这样出来,而且其中存放的是 EventEmitter 这个函数,并且在prototype中存放了 EventEmitter的原型,也就是说JVM可以获得EventEmitter中的所有方法,这也就可以解释了为什么JVM new出之后可以设定异步事件。
node-jvm 是一个比较庞大的部分,今天先分析到这里,在下一章中我会告诉大家一个有效的工具。