1

Javascript では、オブジェクトに関数である多くのプロパティがある場合:

var obj = { foo: function() { ... },
            bar: function() { ... },
              ...
          }

では、これらの関数の名前の配列を取得するにはどうすればよいでしょうか? つまり、配列

["foo", "bar", ... ]

ありがとう。

4

5 に答える 5

5
var names = [];
for( var k in obj ) {
   if(obj.hasOwnProperty(k) && typeof obj[k] == 'function') {
      names.push(k);
   }
}
于 2010-06-13T07:29:14.760 に答える
3
var functions = [];
for (var prop in obj) {
    if ((typeof obj[prop]) == 'function') {
        // it's a function
        functions.push(prop);
    }
}
于 2010-06-13T07:30:17.393 に答える
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て、列挙されたプロパティが実際にオブジェクトに物理的に存在することを確認します。

このアプローチと他のすべての回答には小さな問題があることに注意してください。

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 で修正されました。

于 2010-06-13T07:34:22.260 に答える
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>)オブジェクトのすべての列挙可能なプロパティの名前を配列として返し、その非関数は除外されます。

例-ChromeリリースとWebkitおよびTracemonkey(Firefox)のナイトリービルドで動作します。

于 2010-06-13T09:11:55.453 に答える
1

他の回答を完了するには: 次も使用できますinstanceof

var obj = { foo: function() { ... },
            bar: function() { ... },
              ...
          },
    fnArr = [];

for (var label in obj){
  if (obj[label] instanceof Function){
     fnArr.push(label)
  }
}
于 2010-06-13T07:52:49.733 に答える