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


90

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

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

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

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

Спасибо.


Ответы:


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);
}

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


2
возможно, он имел в виду console.log. Спасибо.
th

2
Да, я не занимаюсь JS каждый день, так что я не на все 100%. Но я понимаю язык ..
ReinstateMonica Larry Osterman

27

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


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__);

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
}

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

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

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];
    });
};
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.