在 Javascript 中,如果一个对象有很多作为函数的属性:
var obj = { foo: function() { ... },
bar: function() { ... },
...
}
那么如何获得这些函数的名称数组呢?也就是一个数组
["foo", "bar", ... ]
谢谢。
在 Javascript 中,如果一个对象有很多作为函数的属性:
var obj = { foo: function() { ... },
bar: function() { ... },
...
}
那么如何获得这些函数的名称数组呢?也就是一个数组
["foo", "bar", ... ]
谢谢。
var names = [];
for( var k in obj ) {
if(obj.hasOwnProperty(k) && typeof obj[k] == 'function') {
names.push(k);
}
}
var functions = [];
for (var prop in obj) {
if ((typeof obj[prop]) == 'function') {
// it's a function
functions.push(prop);
}
}
编辑:我稍微误读了这个问题,您只想提取作为函数对象的属性的名称:
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 平台预览版中修复。
要完成其他答案:您还可以使用instanceof
:
var obj = { foo: function() { ... },
bar: function() { ... },
...
},
fnArr = [];
for (var label in obj){
if (obj[label] instanceof Function){
fnArr.push(label)
}
}
使用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 版本和Webkit和Tracemonkey (Firefox)的夜间构建。