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
て、列挙されたプロパティが実際にオブジェクトに物理的に存在することを確認します。
このアプローチと他のすべての回答には小さな問題があることに注意してください。
JScriptのDontEnum Bugである、プロトタイプ チェーンの上位にある列挙不可能なプロパティ ( 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
には明らかに 4 つの独自のプロパティが定義されていますが、これらのプロパティObject.prototype
は としてマークされています。IEDontEnum
のステートメントでそのオブジェクトのプロパティを列挙しようとしても、for-in
何も見つかりません。
このバグはすべての IE バージョンに存在し、最近 IE9 Platform Preview で修正されました。
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)のナイトリービルドで動作します。
他の回答を完了するには: 次も使用できますinstanceof
。
var obj = { foo: function() { ... },
bar: function() { ... },
...
},
fnArr = [];
for (var label in obj){
if (obj[label] instanceof Function){
fnArr.push(label)
}
}