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

如何获取类或对象中多层嵌套的所有方法/函数?

获取对象多层嵌套的所有函数实现方案

你当前的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:25:23