Wie erhalte ich die Methoden eines Objekts?


Antworten:


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

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.


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.


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.


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

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

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
}

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.


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.


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'


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];
    });
};
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.