在Javascript中,如果一个对象有很多属性是函数:
var obj = { foo: function() { ... },
bar: function() { ... },
...
}
那么如何获得这些函数的名称数组呢?也就是说,一个数组
["foo", "bar", ... ]
感谢。
答案 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 - 适用于Webkit和Tracemonkey (Firefox)的Chrome版本和每晚版本。