Как получить методы объекта? - PullRequest
83 голосов
/ 30 апреля 2011

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

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

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

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

Спасибо.

Ответы [ 12 ]

65 голосов
/ 30 апреля 2011
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}
46 голосов
/ 30 апреля 2011

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

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

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

27 голосов
/ 07 ноября 2014

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

13 голосов
/ 10 мая 2014

В современных браузерах вы можете использовать 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 );

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

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

6 голосов
/ 05 июля 2017

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

  console.log(yourJSObject);

или более непосредственно

  console.dir(yourJSObject.__proto__);
3 голосов
/ 07 июля 2016

В 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"]
2 голосов
/ 23 апреля 2017

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

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

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

2 голосов
/ 30 апреля 2011
var funcs = []
for(var name in myObject) {
    if(typeof myObject[name] === 'function') {
        funcs.push(name)
    }
}

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

1 голос
/ 29 мая 2018

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

function getMethodsOf(obj){
  const methods = {}
  Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ).forEach(methodName => {
    methods[methodName] = obj[methodName]
  })
  return methods
}
1 голос
/ 30 апреля 2011
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.push(key);
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...