在Javascript中,如果有一个具有很多属性的对象是函数,那么如何将它们转换为字符串数组(函数名称)?

时间:2010-06-13 07:27:11

标签: javascript stringification

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

var obj = { foo: function() { ... },
            bar: function() { ... },
              ...
          }
那么如何获得这些函数的名称数组呢?也就是说,一个数组

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

感谢。

5 个答案:

答案 0 :(得分:5)

var names = [];
for( var k in obj ) {
   if(obj.hasOwnProperty(k) && typeof obj[k] == 'function') {
      names.push(k);
   }
}

答案 1 :(得分:3)

var functions = [];
for (var prop in obj) {
    if ((typeof obj[prop]) == 'function') {
        // it's a function
        functions.push(prop);
    }
}

答案 2 :(得分: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方法,以确保枚举属性实际上存在于对象中。

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

原型链中较高的不可枚举属性(DontEnum)的JScript's DontEnum Bug自定义属性不使用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显然定义了四个自己的属性,但是如果您尝试使用{{1来枚举该对象的属性,那么这些属性存在于标记为Object.prototype的{​​{1}}中IE中的语句,它不会找到任何。

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

答案 3 :(得分:1)

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

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

for (var label in obj){
  if (obj[label] instanceof Function){
     fnArr.push(label)
  }
}

答案 4 :(得分: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>)将对象的所有可枚举属性的名称作为数组返回,其中非函数被过滤掉。

Example - 适用于WebkitTracemonkey (Firefox)的Chrome版本和每晚版本。