JavaScript类创建的实例无法枚举类定义的方法,如何获取?
原因说明
通过class语法定义的非构造函数方法,默认会挂载到类的prototype原型对象上,且被标记为不可枚举属性,因此仅遍历实例自有可枚举属性的API(for...in、Object.keys()、Object.values()等)无法读取到这类方法。
解决方案
你可以通过读取实例原型的自有属性来获取所有类方法,不需要修改原有类的定义:
// 工具函数:传入类实例,返回所有可调用的类方法名 function getInstanceMethods(instance) { const prototype = Object.getPrototypeOf(instance); // 遍历到顶层Object原型时终止,避免拿到toString、valueOf等通用内置方法 if (prototype === Object.prototype) return []; // 获取原型上所有自身属性名(包含不可枚举属性) const propNames = Object.getOwnPropertyNames(prototype); // 过滤出函数类型、且不是构造函数的属性 const methods = propNames.filter(prop => { return typeof prototype[prop] === 'function' && prop !== 'constructor'; }); // 如需包含继承的父类方法,保留下方递归逻辑;仅需当前类方法可删除 return [...methods, ...getInstanceMethods(prototype)]; } // 测试用你的Car类示例 class Car { constructor(carname, caryear) { this.name = carname; this.year = caryear; } age() { let date = new Date(); return date.getFullYear() - this.year; } } let myCar = new Car("Ford", 2017); console.log(getInstanceMethods(myCar)); // 输出:['age']
补充适配场景
如果目标类存在用Symbol作为方法名的情况,可调整属性获取逻辑,兼容Symbol类型的方法名:
const propNames = [ ...Object.getOwnPropertyNames(prototype), ...Object.getOwnPropertySymbols(prototype) ];
拿到所有方法名后,你就可以遍历校验每个方法的可用性,按需执行即可。
内容的提问来源于stack exchange,提问作者Eve
相关产品推荐
相关产品推荐

