Wie erhalte ich die Methoden eines Objekts?

89

Gibt es eine Methode oder Eigenschaft, um alle Methoden von einem Objekt abzurufen? Beispielsweise:

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

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

UPDATE: Gibt es eine solche Methode in Jquery?

Danke dir.

thom
quelle

Antworten:

70
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}
Makram Saleh
quelle
2
Der for..inWeg ist der Standardansatz.
Makram Saleh
1
Danke für deine Bearbeitung, Chris! Ich denke, Sie mögen TypeErrors…TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
Julian F. Weinert
Der Code wird jetzt mit eckigen Klammern festgelegt. Entschuldigung für die Unannehmlichkeiten.
Makram Saleh
Das Sortieren des Arrays wurde zur Vereinfachung hinzugefügt.
SomeGuyOnAComputer
Gibt es einen Unterschied, wenn Sie den Zustand bewerten m instanceof Function?
Jose
46

Denken Sie daran, dass technisch Javascript-Objekte keine Methoden haben. Sie haben Eigenschaften, von denen einige Funktionsobjekte sein können. Das bedeutet, dass Sie die Methoden in einem Objekt genauso auflisten können wie die Eigenschaften. Dies (oder etwas in der Nähe davon) sollte funktionieren:

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

Dies führt zu Komplikationen, da einige Eigenschaften von Objekten nicht aufzählbar sind und Sie nicht alle Funktionen des Objekts finden können.

ReinstateMonica Larry Osterman
quelle
2
Vielleicht sprach er über console.log. Danke dir.
thom
2
Ja, ich mache nicht jeden Tag JS, also bin ich nicht 100% auf dem Laufenden. Aber ich verstehe die Sprache ..
ReinstateMonica Larry Osterman
27

Sie können diese console.dir(object)Objekteigenschaften in die Konsole schreiben.

pstenstrm
quelle
17

In modernen Browsern können Sie Object.getOwnPropertyNamesalle Eigenschaften (sowohl aufzählbar als auch nicht aufzählbar) für ein Objekt abrufen. Zum Beispiel:

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

Beachten Sie, dass dadurch nur eigene Eigenschaften abgerufen werden , sodass keine Eigenschaften zurückgegeben werden, die an anderer Stelle in der Prototypenkette gefunden wurden. Dies scheint jedoch nicht Ihre Anfrage zu sein, daher gehe ich davon aus, dass dieser Ansatz ausreichend ist.

Wenn Sie nur aufzählbare Eigenschaften sehen möchten , können Sie stattdessen verwenden Object.keys. Dies würde dieselbe Sammlung abzüglich der nicht aufzählbaren constructorEigenschaft zurückgeben.

Sampson
quelle
6

Die Methoden können in der Prototypenkette des Objekts mit den Entwicklertools des Browsers (F12) überprüft werden:

  console.log(yourJSObject);

oder direkter

  console.dir(yourJSObject.__proto__);
Matoeil
quelle
4

In 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
quelle
4

Für mich war der einzige zuverlässige Weg, um die Methoden der letzten Erweiterungsklasse zu erhalten, Folgendes zu tun:

function getMethodsOf(obj){
  const methods = {}
  Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ).forEach(methodName => {
    methods[methodName] = obj[methodName]
  })
  return methods
}
Jo-Go
quelle
2
var funcs = []
for(var name in myObject) {
    if(typeof myObject[name] === 'function') {
        funcs.push(name)
    }
}

Ich telefoniere ohne Semikolons :), aber das ist die allgemeine Idee.

Matt Greer
quelle
4
Welches Telefon hat keine Semikolons, aber Sie können Fragen beantworten? LOL
Hogan
Ich denke, ein neues Telefon ist Doppelpunkt dein Name!
Redwolf Programme
1
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.push(key);
    }
}

Sie können einfach den Prototyp eines Konstruktors durchlaufen und alle Methoden extrahieren.

Raynos
quelle
Dies berücksichtigt nicht Methoden, die direkt an das Objekt angehängt sind
Matt Greer
@MattGreer sein Beispiel nannte eine Methode auf einem Konstruktor. Ob er Methoden von einem Konstruktor oder einem Objekt will, ist eine andere Sache.
Raynos
1

Der beste Weg ist:

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

benutze 'let' nur in es6, benutze stattdessen 'var'

Arturo Morales Rangel
quelle
1
Es gibt eine Liste der Attribute zurück.
Ali Ben Messaoud
Wie Ali angedeutet hat, schließt dies Funktionen aus, die als Getter / Setter für eine Klasse (Methoden) definiert sind.
Shaun
0

Holen Sie sich die Methodennamen:

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

Oder holen Sie sich die Methoden:

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
quelle