ast

博客主要提及了class类型转换相关内容。

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

class类型转换
var code=`
class Bird{
	constructor(weight){
		this.weight=weight;
	}
	fly(){
		console.log('fly')
	}
	eat(){
		console.log('eat')
	}
}
`;
//babel核心库,用来实现核心的转换引擎
let babel=require('babel-core');
//可以实现类型判断,生成AST节点
let types=require('babel-types');

let visitor={
	ClassDeclaration(path){
		let node=path.node;
		let className = node.id.name;
		let classInner=node.body.body;
		//创建一个数组用来成盛放新生成AST
    	let es5Fns = [];
    	//初始化默认的constructor节点
    	let newConstructorId = types.identifier(className);
    	let constructorFn = types.functionDeclaration(newConstructorId, [types.identifier('')], types.blockStatement([]), false, false)
    	//循环老节点的AST对象
    	console.log(classInner.length)
    	for(let i=0;i<classInner.length;i++){
    		let item=classInner[i];
    		//判断函数的类型是不是constructor
    		if(item.kind=='constructor'){
    			let constructorParams=item.params.length?item.params[0].name:[];
    			let newConstructorParams=types.identifier(constructorParams);
    			let constructorBody = classInner[i].body
    			constructorFn=types.functionDeclaration(newConstructorId, [newConstructorParams], constructorBody, false, false)
    		}
    		//处理其余不是constructor的节点
    		else{
    			let protoTypeObj = types.memberExpression(types.identifier(className), types.identifier('prototype'), false)
		        let left = types.memberExpression(protoTypeObj, types.identifier(item.key.name), false)
		        //定义等号右边
		        let prototypeParams = classInner[i].params.length ? classInner[i].params[i].name : []
		        let newPrototypeParams = types.identifier(prototypeParams)
		        let prototypeBody = classInner[i].body
		        let right = types.functionExpression(null, [newPrototypeParams], prototypeBody, false, false);
		        let protoTypeExpression = types.assignmentExpression("=", left, right)
      			es5Fns.push(protoTypeExpression)
    		}
    	}
    	//循环结束,把constructor节点也放到es5Fns中
	    es5Fns.push(constructorFn)
	    //判断es5Fns的长度是否大于1
	    if (es5Fns.length > 1) {
	     path.replaceWithMultiple(es5Fns)
	    } else {
	     path.replaceWith(constructorFn)
	    }
	}
}

//将code转成ast
let result=babel.transform(code,{
	plugins:{
		visitor
	}
})
console.log(result.code)
var code=`
class Bird{
	constructor(weight){
		this.weight=weight;
	}
	fly(){
		console.log('fly')
	}
	eat(){
		console.log('eat')
	}
}
`;
//babel核心库,用来实现核心的转换引擎
let babel=require('babel-core');
//可以实现类型判断,生成AST节点
let types=require('babel-types');
//将code转成ast
let visitor={
	ClassDeclaration(path){
		let node=path.node;
		let body=node.body.body;
		let className=node.id.name;
		let arr=[];
		let id=types.identifier(className);
		for(let i=0;i<body.length;i++){
			let item=body[i];
			if(item.kind=='constructor'){
				var params=item['params'];
				var bodys=item.body
				let constructor=types.functionDeclaration(id,params,bodys, false, false)
				arr.push(constructor)
			}
			else{
				let protoTypeObj=types.memberExpression(id,types.identifier('prototype'),false)
				var left=types.memberExpression(protoTypeObj,types.identifier(item.key.name),false)
				var right=types.functionExpression(null,item.params,item.body,false,false)
				let protoTypeExpression = types.assignmentExpression("=", left, right)
	      	    arr.push(protoTypeExpression)
			}
		}
		
		
		path.replaceWithMultiple(arr)
	}
}

let result=babel.transform(code,{
	plugins:{
		visitor
	}
})
console.log(result.code)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值