Jak zdobyć metody obiektu?


Odpowiedzi:


71
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}

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.


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.


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ść.


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

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"]

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
}

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ł.


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.


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”


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];
    });
};
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.