如何获取类或对象中多层嵌套的所有方法/函数?
获取对象多层嵌套的所有函数实现方案
你当前的getMethods函数只能抓取对象自身及其原型链上的第一层函数,没法处理嵌套对象里的函数(比如示例里的b.f、b.g.h)。要实现多层嵌套遍历,核心思路是用递归遍历每个属性,遇到嵌套对象就深入处理,同时可以保留原有的原型链遍历逻辑。
问题分析
原代码的逻辑是遍历当前对象及其原型链的第一层属性,过滤出函数,但完全没处理属性值是对象的情况,所以嵌套在子对象里的函数根本不会被检测到。
实现代码
下面是兼顾嵌套对象遍历和原型链遍历的实现:
function getAllNestedMethods(obj, parentPath = '', result = new Set()) { // 遍历当前对象的所有自身属性(包括不可枚举属性) Object.getOwnPropertyNames(obj).forEach(key => { const currentPath = parentPath ? `${parentPath}.${key}` : key; const value = obj[key]; const valueType = typeof value; // 是函数就记录路径 if (valueType === 'function') { result.add(currentPath); } // 是普通对象(非null、非数组)就递归遍历 else if (value !== null && valueType === 'object' && !Array.isArray(value)) { getAllNestedMethods(value, currentPath, result); } }); // 遍历原型链(可根据需求移除这部分) const proto = Object.getPrototypeOf(obj); if (proto && proto !== Object.prototype) { getAllNestedMethods(proto, parentPath, result); } return Array.from(result); } // 测试示例 var obj = { a: [], b: { e: null, f: function() {}, g: { h: function() {}, }, }, c: {}, d: function() {}, } console.log(getAllNestedMethods(obj)); // 输出: ["d", "b.f", "b.g.h"]
可选调整
- 如果只需要对象自身嵌套的函数,不需要原型链上的方法,直接删除原型链遍历的代码块即可
- 如果需要遍历数组中的对象,把判断条件里的
!Array.isArray(value)去掉 - 如果要获取函数本身而非路径,把
result.add(currentPath)改成result.add(value),但注意用Set可以自动去重重复的函数引用
内容的提问来源于stack exchange,提问作者cs6413110
相关产品推荐
相关产品推荐

