1

在 Javascript 中,如果一个对象有很多作为函数的属性:

var obj = { foo: function() { ... },
            bar: function() { ... },
              ...
          }

那么如何获得这些函数的名称数组呢?也就是一个数组

["foo", "bar", ... ]

谢谢。

4

5 回答 5

5
var names = [];
for( var k in obj ) {
   if(obj.hasOwnProperty(k) && typeof obj[k] == 'function') {
      names.push(k);
   }
}
于 2010-06-13T07:29:14.760 回答
3
var functions = [];
for (var prop in obj) {
    if ((typeof obj[prop]) == 'function') {
        // it's a function
        functions.push(prop);
    }
}
于 2010-06-13T07:30:17.393 回答
3

编辑:我稍微误读了这个问题,您只想提取作为函数对象的属性的名称

function methods(obj) {
  var result = [];
  for (var prop in obj) {
    if (obj.hasOwnProperty(prop) && typeof obj[prop] == 'function') {
      result.push(prop);
    }
  }
  return result;
}

var obj = {
  foo: function() { },
  bar: function() { },
};

methods(obj); // ["foo", "bar"]

我正在使用该hasOwnProperty方法,以确保枚举的属性实际上存在于对象中。

请注意,这种方法和所有其他答案都有一个小问题 IE。

JScript的DontEnum 错误,在原型链中隐藏不可枚举属性 ( DontEnum) 的自定义属性,不使用 for-in 语句枚举,例如:

var foo = {
  constructor : function() { return 0; },
  toString : function() { return "1"; },
  valueOf : function() { return 2; }
  toLocaleString : function() { return "3"; }
};

for (var propName in foo ) { alert(propName); }

该对象foo明确定义了四个自己的属性,但这些属性存在于Object.prototype标记为 中DontEnum,如果您尝试for-in在 IE 中使用该语句枚举该对象的属性,它将找不到任何属性。

此错误存在于所有 IE 版本上,最近已在 IE9 平台预览版中修复。

于 2010-06-13T07:34:22.260 回答
1

要完成其他答案:您还可以使用instanceof

var obj = { foo: function() { ... },
            bar: function() { ... },
              ...
          },
    fnArr = [];

for (var label in obj){
  if (obj[label] instanceof Function){
     fnArr.push(label)
  }
}
于 2010-06-13T07:52:49.733 回答
1

使用ES5

var obj = {
    foo: function() {},
    bar: function() {},
    baz: true
};

function getMethods(object) {
    return Object.keys(object).filter(function(key) {
        return typeof object[key] == 'function';
    });
}

getMethods(obj); // [foo, bar]

Object.keys(<object>)将对象的所有可枚举属性的名称作为数组返回,其中的非函数被过滤掉。

示例- 适用于 Chrome 版本和WebkitTracemonkey (Firefox)的夜间构建。

于 2010-06-13T09:11:55.453 回答