Nodejs 如何获得 class 内部的方法?

发布于 1周前 作者 caililin 来自 nodejs/Nestjs

求教:如下类运行的时候,如何在 constructor 中获得 App 所定义的方法名称

class App {
  constructor() {
    // 如何在这里获得 App 下面的所有方法?
  }
  play() {}
  unplay() {}
  pause() {}
  dosome() {}
  dosome2() {}
}
new App()

Nodejs 如何获得 class 内部的方法?

11 回复

不是有反射的 API 吗?

Class 所有信息都可以拿到。

Class<App> appClass = App.class;
Method[] methods = appClass.getDeclaredMethods();

用 Reflect

class App {
constructor() {
// 如何在这里获得 App 下面的所有方法?
const {ownKeys, getPrototypeOf} = Reflect;
console.log(‘methods:’, ownKeys(getPrototypeOf(this)));
// 多了一个 constructor ,自行 filter 下
}
play() {}
unplay() {}
pause() {}
dosome() {}
dosome2() {}
}
new App() // output: [ ‘constructor’, ‘play’, ‘unplay’, ‘pause’, ‘dosome’, ‘dosome2’ ]

呃呃我审题不认真了😫

constructor() {
this.proto = Object.getPrototypeOf(this);

const methods = Object.getOwnPropertyNames(this.proto).filter(item => typeof this.proto[item] === ‘function’)

console.log(methods)
}

通过 Object.getOwnPropertyNames(App.prototype) 获取 App 类原型上的所有属性名称(包括方法名)。然后用 filter 筛选出类型为函数(方法)且不是 constructor 的属性

这题我不会,所以,直接丢王炸:

constructor() {
var code=App+"";
//从源码文本 code 中提取函数名字😂
}

针对附言的回复:web 的“感谢”,是需要鼠标悬停才会显示的,悬停位置在楼号左边的回复按钮的左边

class App {
constructor() {
const funcs = Object.getOwnPropertyNames(Reflect.getPrototypeOf(this)).filter(it => it != ‘constructor’)
console.log(funcs)
}
play() {}
unplay() {}
pause() {}
dosome() {}
dosome2() {}
}

new App()

在 Node.js 中,你可以通过反射机制(如 Reflect 对象或 Object 对象的内置方法)来获取一个类内部的方法。这通常涉及访问类的 prototype 属性,因为 JavaScript 中的类方法是定义在其原型上的。

以下是一个示例,展示如何获取一个类内部的方法:

class MyClass {
    method1() {
        console.log('This is method1');
    }

    method2() {
        console.log('This is method2');
    }
}

// 获取 MyClass 的原型
const proto = MyClass.prototype;

// 使用 Object.getOwnPropertyNames 获取所有可枚举和不可枚举的属性名(包括方法名)
const methodNames = Object.getOwnPropertyNames(proto)
    .filter(prop => typeof proto[prop] === 'function');

console.log('Methods in MyClass:', methodNames);

// 另一种方法,使用 Reflect.ownKeys,结果可能包含 symbol 类型的键
const allKeys = Reflect.ownKeys(proto);
const filteredMethods = allKeys
    .filter(key => typeof proto[key] === 'function' && typeof key === 'string');

console.log('Filtered methods in MyClass (using Reflect):', filteredMethods);

在这个示例中,我们首先获取了 MyClass 的原型对象,然后使用 Object.getOwnPropertyNames 获取原型上所有属性的名称,并通过过滤出类型为函数的属性名来找到方法名。另外,我们也展示了如何使用 Reflect.ownKeys 获取所有键(包括 symbol 类型的键),并进行了类似的过滤。

这种方法可以帮助你在运行时动态地获取一个类的方法列表。

回到顶部