1. 目标
主要通过分析Rhino,讲述javascript创建对象及this的意义
2. javascript测试代码
var vipObj = new vipFun();
function vipFun(){
this.vipVar='一家专门做特卖的网站';
}
3. 生成的AST抽象语法树
SCRIPT [var vipObj = new vipFun();function vipFun() { this.vipVar = '\u4e00\u5bb6\u4e13\u95e8\u505a\u7279\u5356\u7684\u7f51\u7ad9';}]
VAR [var vipObj = new vipFun();]
VAR [vipObj = new vipFun()]
NAME [vipObj]
NEW [new vipFun()]
NAME [vipFun]
FUNCTION [function vipFun() { this.vipVar = '\u4e00\u5bb6\u4e13\u95e8\u505a\u7279\u5356\u7684\u7f51\u7ad9';}]
NAME [vipFun]
BLOCK [{ this.vipVar = '\u4e00\u5bb6\u4e13\u95e8\u505a\u7279\u5356\u7684\u7f51\u7ad9';}]
EXPR_VOID [this.vipVar = '\u4e00\u5bb6\u4e13\u95e8\u505a\u7279\u5356\u7684\u7f51\u7ad9';]
ASSIGN [this.vipVar = '\u4e00\u5bb6\u4e13\u95e8\u505a\u7279\u5356\u7684\u7f51\u7ad9']
GETPROP [this.vipVar]
THIS [this]
NAME [vipVar]
STRING ['\u4e00\u5bb6\u4e13\u95e8\u505a\u7279\u5356\u7684\u7f51\u7ad9']
具体图形化AST语法树可以借助: http://jointjs.com/demos/javascript-ast
4. IRFactory将ast语法树转换成为内部表现形式
略
5. 编译生成byteCode虚拟字节码
主要生成byteCode字节码:
//具体见Context.compileImpl()方法;
Object bytecode = compiler.compile(compilerEnv,tree, tree.getEncodedSource(),returnFunction);
转换后的虚拟字节码:
主代码虚拟字节码:
MaxStack = 2
[0] LINE : 1
[3] REG_STR_C0
[4] BINDNAME
[5] REG_STR_C1
[6] NAME
[7] REG_IND_C0
[8] NEW 0
[9] REG_STR_C0
[10] SETNAME
[11] POP
[12] REG_IND