Jak zdobyć metody obiektu?

90

Czy istnieje metoda lub właściwość pobierania wszystkich metod z obiektu? Na przykład:

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

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

AKTUALIZACJA: Czy w Jquery jest jakaś taka metoda?

Dziękuję Ci.

thom
źródło

Odpowiedzi:

71
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}
Makram Saleh
źródło
2
for..inSposób jest standardowym podejściem.
Makram Saleh
1
Dzięki za twoją edycję, Chris! Myślę, że lubisz TypeErrors…TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
Julian F. Weinert,
Kod jest teraz naprawiony nawiasami kwadratowymi. Przepraszam za niedogodności.
Makram Saleh
Dodano sortowanie tablicy dla wygody.
SomeGuyOnAComputer
czy jest różnica, jeśli oceniasz stan m instanceof Function?
Jose
46

Pamiętaj, że technicznie obiekty javascript nie mają metod. Mają właściwości, z których niektóre mogą być obiektami funkcji. Oznacza to, że możesz wyliczyć metody w obiekcie, tak jak możesz wyliczyć właściwości. To (lub coś zbliżonego) powinno działać:

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

Są z tym komplikacje, ponieważ niektórych właściwości obiektów nie można wyliczyć, więc nie będzie można znaleźć wszystkich funkcji w obiekcie.

Przywróć Monikę Larry Osterman
źródło
2
może mówił o console.log. Dziękuję Ci.
thom
2
Tak, nie robię JS codziennie, więc nie jestem na 100% gotowy. Ale rozumiem język…
ReinstateMonica Larry Osterman
27

Możesz użyć console.dir(object)do zapisania tych właściwości obiektów w konsoli.

pstenstrm
źródło
18

W nowoczesnych przeglądarkach można użyć Object.getOwnPropertyNamesdo pobrania wszystkich właściwości (zarówno wyliczalnych, jak i niewliczalnych) obiektu. Na przykład:

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

Zauważ, że to pobiera tylko własne właściwości , więc nie zwróci właściwości znalezionych gdzie indziej w łańcuchu prototypów. To jednak nie wydaje się być Twoją prośbą, więc przyjmuję, że takie podejście jest wystarczające.

Jeśli chcesz zobaczyć tylko wyliczalne właściwości, możesz zamiast tego użyć Object.keys. To zwróci tę samą kolekcję, pomniejszoną o niewliczalną constructorwłaściwość.

Sampson
źródło
6

Metody można sprawdzić w łańcuchu prototypów obiektu za pomocą narzędzi programistycznych przeglądarki (F12):

  console.log(yourJSObject);

lub bardziej bezpośrednio

  console.dir(yourJSObject.__proto__);
Matoeil
źródło
4

W 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"]
Kevin Beal
źródło
4

dla mnie jedynym niezawodnym sposobem uzyskania metod ostatniej klasy rozszerzającej było zrobienie tego w następujący sposób:

function getMethodsOf(obj){
  const methods = {}
  Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ).forEach(methodName => {
    methods[methodName] = obj[methodName]
  })
  return methods
}
DevTheJo
źródło
2
var funcs = []
for(var name in myObject) {
    if(typeof myObject[name] === 'function') {
        funcs.push(name)
    }
}

Rozmawiam przez telefon bez średników :) ale taki jest ogólny pomysł.

Matt Greer
źródło
4
Który telefon nie ma średników, ale pozwala odpowiedzieć na pytania? LOL
Hogan
Myślę, że twój nowy telefon to dwukropek !
Redwolf Programs
1
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.push(key);
    }
}

Możesz po prostu zapętlić prototyp konstruktora i wyodrębnić wszystkie metody.

Raynos
źródło
To nie będzie uwzględniać metod bezpośrednio dołączonych do obiektu
Matt Greer
@MattGreer jego przykład wywołał metodę w konstruktorze. To, czy chce metod od konstruktora, czy obiektu, to inna sprawa.
Raynos
1

najlepszy sposób to:

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

użyj „let” tylko w es6, zamiast tego użyj „var”

Arturo Morales Rangel
źródło
1
Zwraca listę atrybutów.
Ali Ben Messaoud,
Jak wspomniał Ali, wyklucza to funkcje zdefiniowane jako pobierające / ustawiające w klasie (metodach).
Shaun
0

Uzyskaj nazwy metod:

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

Lub pobierz metody:

var getMethods     = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    })).map(function (key) {
        return obj[key];
    });
};
sidanmor
źródło