class类型转换
var code=`
class Bird{
constructor(weight){
this.weight=weight;
}
fly(){
console.log('fly')
}
eat(){
console.log('eat')
}
}
`;
let babel=require('babel-core');
let types=require('babel-types');
let visitor={
ClassDeclaration(path){
let node=path.node;
let className = node.id.name;
let classInner=node.body.body;
let es5Fns = [];
let newConstructorId = types.identifier(className);
let constructorFn = types.functionDeclaration(newConstructorId, [types.identifier('')], types.blockStatement([]), false, false)
console.log(classInner.length)
for(let i=0;i<classInner.length;i++){
let item=classInner[i];
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)
}
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)
}
}
es5Fns.push(constructorFn)
if (es5Fns.length > 1) {
path.replaceWithMultiple(es5Fns)
} else {
path.replaceWith(constructorFn)
}
}
}
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')
}
}
`;
let babel=require('babel-core');
let types=require('babel-types');
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)