Як отримати методи об'єкта?


90

Чи існує метод або властивість, щоб отримати всі методи від об'єкта? Наприклад:

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

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

ОНОВЛЕННЯ: Чи є такий метод у Jquery?

Дякую.


Дивіться також: stackoverflow.com/questions/3252406 / ...
sligocki

Відповіді:


71
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?
Хосе

46

Пам’ятайте, що технічно об’єкти javascript не мають методів. Вони мають властивості, деякі з яких можуть бути об’єктами функцій. Це означає, що ви можете перерахувати методи в об'єкті так само, як і властивості. Це (або щось близьке до цього) має спрацювати:

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

У цьому є ускладнення, оскільки деяких властивостей об’єктів не перелічено, тому ви не зможете знайти всі функції об’єкта.


2
можливо, він говорив про console.log. Дякую.
thom

2
Так, я не роблю JS щодня, тому я не на 100% з цим. Але я розумію мову ..
ReinstateMonica Ларрі Остерман

27

Ви можете використовувати console.dir(object)для запису властивостей об’єктів у консоль.


18

У сучасних браузерах ви можете 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
Хоган

Я думаю, що новий телефон - двокрапка - ваше ім’я!
Програми Redwolf

1
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.push(key);
    }
}

Ви можете просто прокрутити прототип конструктора та витягти всі методи.


Це не враховує методи, безпосередньо прикріплені до об'єкта
Метт Грір,

@MattGreer у своєму прикладі назвав метод на конструкторі. Інша справа, чи хоче він методи від конструктора чи об’єкта.
Райнос,

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.