Comment obtenir les méthodes d'un objet?

89

Existe-t-il une méthode ou une propriété pour obtenir toutes les méthodes d'un objet? Par exemple:

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

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

MISE À JOUR: Y a-t-il une méthode comme celle-là dans Jquery?

Je vous remercie.

thom
la source

Réponses:

70
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}
Makram Saleh
la source
2
La for..invoie est l'approche standard.
Makram Saleh
1
Merci pour votre modification, Chris! Je pense que vous aimez TypeErrors…TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
Julian F. Weinert
Le code est maintenant fixé avec des crochets. Désolé pour le dérangement.
Makram Saleh
Ajout du tri du tableau pour plus de commodité.
SomeGuyOnAComputer
y a-t-il une différence si vous évaluez la condition m instanceof Function?
Jose le
46

Rappelez-vous que techniquement, les objets javascript n'ont pas de méthodes. Ils ont des propriétés, dont certaines peuvent être des objets de fonction. Cela signifie que vous pouvez énumérer les méthodes dans un objet tout comme vous pouvez énumérer les propriétés. Ceci (ou quelque chose de proche) devrait fonctionner:

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

Il y a des complications à cela car certaines propriétés des objets ne sont pas énumérables et vous ne pourrez donc pas trouver toutes les fonctions de l'objet.

Réintégrer Monica Larry Osterman
la source
2
peut-être parlait-il de console.log. Je vous remercie.
thom
2
Ouais, je ne fais pas de JS tous les jours donc je ne suis pas à 100% dessus. Mais je comprends la langue ..
ReinstateMonica Larry Osterman
27

Vous pouvez utiliser console.dir(object)pour écrire les propriétés des objets dans la console.

pstenstrm
la source
17

Dans les navigateurs modernes, vous pouvez utiliser Object.getOwnPropertyNamespour obtenir toutes les propriétés (énumérables et non énumérables) sur un objet. Par exemple:

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

Notez que cela ne récupère que les propriétés propres , donc il ne retournera pas les propriétés trouvées ailleurs sur la chaîne de prototypes. Cependant, cela ne semble pas être votre demande, je suppose donc que cette approche est suffisante.

Si vous souhaitez uniquement voir les propriétés énumérables , vous pouvez utiliser à la place Object.keys. Cela renverrait la même collection, moins la constructorpropriété non énumérable .

Sampson
la source
6

Les méthodes peuvent être inspectées dans la chaîne prototype de l'objet à l'aide des outils de développement du navigateur (F12):

  console.log(yourJSObject);

ou plus directement

  console.dir(yourJSObject.__proto__);
Matoeil
la source
4

Dans 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
la source
4

pour moi, le seul moyen fiable d'obtenir les méthodes de la classe d'extension finale, était de faire comme ceci:

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

Je suis sur un téléphone sans point virgule :) mais c'est l'idée générale.

Matt Greer
la source
4
Quel téléphone n'a pas de point-virgule mais vous permet de répondre aux questions? LOL
Hogan
Je pense qu'un nouveau téléphone est colon votre nom!
Programmes Redwolf
1
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.push(key);
    }
}

Vous pouvez simplement boucler sur le prototype d'un constructeur et extraire toutes les méthodes.

Raynos
la source
Cela ne tiendra pas compte des méthodes directement attachées à l'objet
Matt Greer
@MattGreer son exemple a appelé une méthode sur un constructeur. Qu'il veuille des méthodes d'un constructeur ou d'un objet est une autre affaire.
Raynos
1

le meilleur moyen est:

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

utilisez 'let' uniquement dans es6, utilisez 'var' à la place

Arturo Morales Rangel
la source
1
Il renvoie une liste des attributs.
Ali Ben Messaoud
Comme Ali l'a fait allusion, cela exclut les fonctions définies comme des getters / setters sur une classe (méthodes).
Shaun
0

Obtenez les noms de méthode:

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

Ou, obtenez les méthodes:

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
la source