在Javascript中,如果一個對象有很多是功能性的:在Javascript中,如果有一個具有很多屬性的對象是函數,那麼如何將它們轉換爲(函數名稱的)字符串數組?
var obj = { foo: function() { ... },
bar: function() { ... },
...
}
那麼又如何讓這些功能的名稱數組?也就是數組
["foo", "bar", ... ]
謝謝。
在Javascript中,如果一個對象有很多是功能性的:在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);
}
}
除非您使用**小寫**「功能」 – 2010-06-13 07:37:23
固定,否則這將不起作用。謝謝:-) – ob1 2010-06-13 07:42:29
編輯:我已經稍微誤解的問題,要提取的的名稱僅是函數對象的屬性:
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有一個小問題。
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
明確定義:
的JScript's DontEnum Bug,定製該陰影非枚舉的屬性(DontEnum
)在原型鏈更高的特性,不使用換在語句,例如列舉四個自己的屬性,但這些屬性存在Object.prototype
Object.prototype
標記爲DontEnum
,如果您嘗試使用IE中的for-in
語句枚舉該對象的屬性,它將找不到任何屬性。
此錯誤存在於所有IE版本中,並且最近已在IE9平臺預覽中修復。
+1提到hasOwnProperty,但我相信簡後功能,而不是所有的屬性。 – 2010-06-13 07:46:51
要完成其他答案:你也可以使用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>)
返回一個對象的所有可枚舉屬性的名稱作爲數組,其中的非功能被過濾掉。
Example - 適用於Chrome版本和夜間版本的Webkit和Tracemonkey (Firefox)。
有趣的是,如何將不推入函數引用到數組中而將推入函數的名字? – 2010-06-13 07:51:17
''在屬性名稱的循環中,而不是實際的屬性。所以如果你想引用每個屬性,你可以使用'obj [k]'。 – 2010-06-13 07:52:49
那麼如果裏面只有1個函數呢,還需要用一個「for in」循環來達到這個目的嗎?如果「for in」循環不存在,還有另一種方法嗎? – 2010-06-13 07:56:53