Как получить методы объекта?

90

Есть ли способ или свойство получить все методы от объекта? Например:

function foo() {}
foo.prototype.a = function() {}
foo.prototype.b = function() {}

foo.get_methods(); // returns ['a', 'b'];

ОБНОВЛЕНИЕ: есть ли такой метод в JQuery?

Спасибо.

thom
источник
См. Также: stackoverflow.com/questions/3252406/…
sligocki

Ответы:

72
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}
Макрам Салех
источник
2
for..inСпособ является стандартным подходом.
Макрам Салех
1
Спасибо за редактирование, Крис! Я думаю, вам нравятся TypeErrors…TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
Джулиан Ф. Вайнерт
Код теперь фиксируется квадратными скобками. Приносим извинения за неудобства.
Макрам Салех
Добавлена ​​сортировка массива для удобства.
SomeGuyOnAComputer,
есть ли разница, если вы оцениваете состояние m instanceof Function?
Jose
46

Помните, что технически объекты javascript не имеют методов. У них есть свойства, некоторые из которых могут быть функциональными объектами. Это означает, что вы можете перечислять методы в объекте точно так же, как вы можете перечислять свойства. Это (или что-то близкое к этому) должно работать:

var bar
for (bar in foo)
{
    console.log("Foo has property " + bar);
}

Здесь есть сложности, потому что некоторые свойства объектов не перечисляются, поэтому вы не сможете найти все функции объекта.

Reinstate - Моника Ларри Остерман
источник
2
возможно, он имел в виду console.log. Спасибо.
th
2
Да, я не занимаюсь JS каждый день, так что я не на все 100%. Но я понимаю язык ..
ReinstateMonica Larry Osterman
27

Вы можете использовать console.dir(object)для записи свойств этих объектов в консоль.

pstenstrm
источник
19

В современных браузерах вы можете использовать Object.getOwnPropertyNamesдля получения всех свойств (как перечислимых, так и неперечисляемых) объекта. Например:

function Person ( age, name ) {
    this.age = age;
    this.name = name;
}

Person.prototype.greet = function () {
    return "My name is " + this.name;
};

Person.prototype.age = function () {
    this.age = this.age + 1;
};

// ["constructor", "greet", "age"]
Object.getOwnPropertyNames( Person.prototype );

Обратите внимание, что это извлекает только собственные свойства , поэтому не будет возвращать свойства, найденные где-либо еще в цепочке прототипов. Однако, похоже, это не ваша просьба, поэтому я предполагаю, что этого подхода достаточно.

Если вы хотите видеть только перечислимые свойства, вы можете вместо этого использовать Object.keys. Это вернет ту же коллекцию, за исключением неперечислимого constructorсвойства.

Сампсон
источник
6

Эти методы можно проверить в цепочке прототипов объекта с помощью инструментов разработчика браузера (F12):

  console.log(yourJSObject);

или более прямо

  console.dir(yourJSObject.__proto__);
Matoeil
источник
4

В ES6:

let myObj   = {myFn : function() {}, tamato: true};
let allKeys = Object.keys(myObj);
let fnKeys  = allKeys.filter(key => typeof myObj[key] == 'function');
console.log(fnKeys);
// output: ["myFn"]
Кевин Бил
источник
4

для меня единственный надежный способ получить методы последнего расширяющегося класса заключался в следующем:

function getMethodsOf(obj){
  const methods = {}
  Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ).forEach(methodName => {
    methods[methodName] = obj[methodName]
  })
  return methods
}
DevTheJo
источник
2
var funcs = []
for(var name in myObject) {
    if(typeof myObject[name] === 'function') {
        funcs.push(name)
    }
}

Я говорю по телефону без точек с запятой :) но это общая идея.

Мэтт Грир
источник
4
В каком телефоне нет точки с запятой, но можно отвечать на вопросы? LOL
Hogan
Думаю, новый телефон - это ваше имя с двоеточием !
Redwolf Programs
1
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.push(key);
    }
}

Вы можете просто перебрать прототип конструктора и извлечь все методы.

Райнос
источник
При этом не будут учитываться методы, напрямую привязанные к объекту
Мэтт Грир
@MattGreer в своем примере вызывал метод конструктора. Другое дело, хочет ли он методов от конструктора или объекта.
Raynos
1

лучший способ:

let methods = Object.getOwnPropertyNames(yourobject);
console.log(methods)

используйте let только в es6, вместо этого используйте var

Артуро Моралес Рангель
источник
1
Он возвращает список атрибутов.
Али Бен Мессауд
Как упомянул Али, это исключает функции, определенные как геттеры / сеттеры в классе (методы).
Шон
0

В Chrome есть keys(foo.prototype). Возврат ["a", "b"].

См. Https://developer.chrome.com/devtools/docs/commandline-api#keysobjectвведите описание изображения здесь

Последующее редактирование: если вам нужно быстро скопировать его (для более крупных объектов), сделайте это, copy(keys(foo.prototype))и он будет в буфере обмена.

Шербан Гицэ
источник
0

Получите имена методов:

var getMethodNames = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    }));
};

Или получите методы:

var getMethods     = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    })).map(function (key) {
        return obj[key];
    });
};
Сиданмор
источник