获取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()
将其转换为字符串构造函数
部分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是否如此强大。在构造函数中添加{&}时,函数似乎无法正常工作。请看一看问题末尾添加的新示例,它们确实很强大!检查我的更新代码段。我已经在代码段中插入了您的示例。