You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:54:57