在Javascript中,如果有一个对象有很多属性是函数,如何将它们转换为字符串数组(函数名的数组)?
在Javascript中,如果一个对象有许多属于函数的属性:在Javascript中,如果有一个对象有很多属性是函数,如何将它们转换为字符串数组(函数名的数组)?,javascript,stringification,Javascript,Stringification,在Javascript中,如果一个对象有许多属于函数的属性: var obj = { foo: function() { ... }, bar: function() { ... }, ... } 那么如何获得这些函数的名称数组呢?即数组 ["foo", "bar", ... ] 谢谢。编辑:我有点误读了这个问题,您只想提取函数对象属性的名称: var names = []; for( var k in obj ) {
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);
}
}
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"]
我正在使用该方法,以确保枚举属性实际上存在于对象中
请注意,此方法和所有其他答案都有一个小问题,即
不使用for in语句枚举在原型链中较高位置隐藏不可枚举属性(DontEnum
)的自定义属性,例如:
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
明确定义了四个自己的属性,但这些属性存在于对象中。prototype
标记为DontEnum
,如果您尝试使用IE中的for in
语句枚举该对象的属性,它将找不到任何属性
此错误在所有IE版本中都存在,最近已在IE9平台预览中修复。编辑:我稍微误解了这个问题,您只想提取作为函数对象的属性的名称:
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"]
我正在使用该方法,以确保枚举属性实际上存在于对象中
请注意,此方法和所有其他答案都有一个小问题,即
不使用for in语句枚举在原型链中较高位置隐藏不可枚举属性(DontEnum
)的自定义属性,例如:
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
明确定义了四个自己的属性,但这些属性存在于对象中。prototype
标记为DontEnum
,如果您尝试使用IE中的for in
语句枚举该对象的属性,它将找不到任何属性
此错误在所有IE版本中都存在,最近已在IE9平台预览中修复。要完成其他答案,您还可以使用
instanceof
:
var obj = { foo: function() { ... },
bar: function() { ... },
...
},
fnArr = [];
for (var label in obj){
if (obj[label] instanceof Function){
fnArr.push(label)
}
}
要完成其他答案:您还可以使用
instanceof
:
var obj = { foo: function() { ... },
bar: function() { ... },
...
},
fnArr = [];
for (var label in obj){
if (obj[label] instanceof Function){
fnArr.push(label)
}
}
与:
Object.keys()
以数组形式返回对象的所有可枚举属性的名称,其中非函数被过滤掉
-适用于和的Chrome版本和夜间版本。:
Object.keys()
以数组形式返回对象的所有可枚举属性的名称,其中非函数被过滤掉
-致力于Chrome发布和和的夜间构建。+1用于提及hasOwnProperty,但我相信Jian只是关注功能,而不是所有属性。+1用于提及hasOwnProperty,但我相信Jian只是关注功能,而不是所有属性。有趣,“为什么推送”不会将函数引用推送到数组中,而是将函数名推送到属性名上,而不是实际属性。因此,如果要引用每个属性,可以使用
obj[k]
。因此,如果内部只有一个函数,那么还必须使用“for-in”循环来实现此目的呢?如果“for in”循环不存在,还有其他方法吗?要枚举属性,必须使用for..in
。没有其他正确的方法。有趣的是,为什么push不会将函数引用推送到数组中,而是将函数名推送到属性名上的in循环中,而不是实际的属性。因此,如果要引用每个属性,可以使用obj[k]
。因此,如果内部只有一个函数,那么还必须使用“for-in”循环来实现此目的呢?如果“for in”循环不存在,还有其他方法吗?要枚举属性,必须使用for..in
。没有其他正确的方法。