3. javascript 引擎Rhino源代码分析 浅析 实例函数对象及this

本文深入探讨JavaScript引擎Rhino,通过源代码分析讲解JavaScript如何创建对象以及this关键字的作用。文中详细解析了从AST语法树转换为内部表示、编译生成byteCode虚拟字节码的过程,并重点剖析了New操作、函数对象创建时的虚拟字节码执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值