В Javascript, если есть объект с большим количеством свойств, которые являются функциями, как вы преобразуете их в массив строк (из имен функций)? - PullRequest
1 голос
/ 13 июня 2010

В Javascript, если у объекта есть множество свойств, которые являются функциями:

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

, тогда как вы можете получить массив имен этих функций?То есть массив

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

спасибо.

Ответы [ 5 ]

5 голосов
/ 13 июня 2010
var names = [];
for( var k in obj ) {
   if(obj.hasOwnProperty(k) && typeof obj[k] == 'function') {
      names.push(k);
   }
}
3 голосов
/ 13 июня 2010

Редактировать: Я немного неправильно прочитал вопрос, вы хотите извлечь имена только свойств, которые являются функциональными объектами:

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 Platform Preview.

3 голосов
/ 13 июня 2010
var functions = [];
for (var prop in obj) {
    if ((typeof obj[prop]) == 'function') {
        // it's a function
        functions.push(prop);
    }
}
1 голос
/ 13 июня 2010

С 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) .

1 голос
/ 13 июня 2010

Для завершения других ответов: вы также можете использовать instanceof:

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

for (var label in obj){
  if (obj[label] instanceof Function){
     fnArr.push(label)
  }
}
...