如何在JavaScript中获取类及其父类的方法名?
获取实例的所有方法(含父类方法)
问题描述
我有如下基类A和子类B:
class A { a() { return; } } class B extends A { b() { return; } }
创建B的实例后:
const b = new B();
想实现一个getMethodsOf函数,获取该实例的所有方法名,预期结果是['a', 'b']。
目前我用Object.getOwnPropertyNames(Object.getPrototypeOf(b))只能拿到子类B的方法(返回['constructor', 'b']),不知道怎么获取父类的方法。
编辑:有人把这个问题标记为重复,但实际不是,因为那个问题不涉及父类方法的获取。
实现方案
要获取继承链上的所有自定义方法,核心是遍历原型链,逐层收集每个原型上的自有方法,同时排除构造函数和非函数属性。
具体代码实现
function getMethodsOf(instance) { const methods = new Set(); let currentPrototype = Object.getPrototypeOf(instance); // 遍历原型链,直到Object.prototype(如需包含Object自带方法可去掉此判断) while (currentPrototype && currentPrototype !== Object.prototype) { const propNames = Object.getOwnPropertyNames(currentPrototype); propNames.forEach(name => { // 排除构造函数,只保留函数类型的属性 if (name !== 'constructor' && typeof currentPrototype[name] === 'function') { methods.add(name); } }); // 向上移动到父类原型 currentPrototype = Object.getPrototypeOf(currentPrototype); } return Array.from(methods); } // 测试验证 const b = new B(); console.log(getMethodsOf(b)); // 输出: ['b', 'a'](顺序随遍历顺序而定,Set自动去重)
代码说明
- 使用
Set存储方法名:避免子类重写父类方法时出现重复条目,确保只保留子类的实现版本。 - 原型链遍历逻辑:从实例的直接原型(B的原型)出发,逐层向上遍历到
Object.prototype,如果需要包含toString等Object自带方法,可以移除currentPrototype !== Object.prototype的判断。 - 筛选规则:明确排除
constructor,且只保留属性值为函数的条目,确保拿到的是业务方法而非普通属性。
内容的提问来源于stack exchange,提问作者suitendaal
相关产品推荐
相关产品推荐

