获取JavaScript类构造函数的源代码

获取JavaScript类构造函数的源代码,javascript,reflection,metaprogramming,Javascript,Reflection,Metaprogramming,我需要创建一个方法GetCode,返回一个字符串,其中包含任何类的构造函数的源代码。比如说, let code = GetCode (class CX { constructor () { this.x = 1 this.y = 1 this.fx () this.fy () } fx () {} fy () {} }) 应在code变量中返回与此类似的值: ` this.x = 1 this.y = 1 this.fx () t

我需要创建一个方法
GetCode
,返回一个字符串,其中包含任何类的构造函数的源代码。比如说,

let code = GetCode (class CX {
  constructor () {
    this.x = 1
    this.y = 1
    this.fx ()
    this.fy ()
  }
  fx () {}
  fy () {}
})
应在
code
变量中返回与此类似的值:

`
  this.x = 1
  this.y = 1
  this.fx ()
  this.fy ()
`
对于常规方法,例如
fx
fy
,一个简单的
。toString
调用就足够了。但是,当对构造函数执行此操作时,返回的字符串是类的整个文本,而不是函数的内部源代码。我试图解析
CX.toString()
返回的字符串,以便使用
JSCodeShift
等工具准确获取所需的文本片段,但指纹太重(5Mb)

我想知道是否有可能设计出一种破解方法,用我需要的源代码来获取字符串

其他例子:

let code = GetCode (class CX {
  constructor ({ min, max }) {
    if (min < max) {
      for (let x = min; x < max; x++) {
        console.log (x)
      }
    } 
    this.min = min
    this.max = max
  }
  fmin () { return this.min }
  fmax () { return this.min }
})
let code=GetCode(CX类){
构造函数({min,max}){
如果(最小值<最大值){
对于(设x=min;x
所以,我得到了解决方案。遵循以下步骤-

  • 获取类并使用
    toString()
    将其转换为字符串
  • 使用regexp获取结果字符串的
    构造函数
    部分
  • 将子字符串拆分为数组。执行
    pop()
    shift()
    以移除阵列中不必要的部分
  • 最后,将数组作为字符串连接
  • 下面的代码片段解释了这一切-

    console.log(getCode(类CX{
    构造函数(){
    这个.x=1;
    这个y=1;
    这是fx();
    this.fy();
    }
    fx(){}
    fy(){}
    }));
    console.log(getCode)(类CX{
    构造函数({min,max}){
    如果(最小值<最大值){
    对于(设x=min;x}
    如果将其传输到ES5,它会将方法添加到
    原型中
    ,而
    构造函数中的代码将添加到构造函数中。(使用ES2015松散预设。ES2015预设添加了额外的检查)(这也将在构造函数中传输
    super()
    let
    和其他ES2015+语法。因此,这不是一个万无一失的黑客行为)哇!!令人难以置信的简单和优雅的正则表达式。你的解决方案已经适合我的情况了。但是,对于一般性的抖动,Hoy是否扩展代码以考虑构造函数参数的重构?类似于
    constructor({name,age}){…
    @JavierVélez,我也为这种情况编辑了代码段。在正则表达式中,检查右括号(
    }
    )后面是否紧接着一个新行字符。请查看我的答案以了解详细信息。我还包括了一个这种类型的例子。太棒了!但我不确定regexp是否如此强大。在构造函数中添加{&}时,函数似乎无法正常工作。请看一看问题末尾添加的新示例,它们确实很强大!检查我的更新代码段。我已经在代码段中插入了您的示例。