web-dev-qa-db-fra.com

Comment obtenir les méthodes d'un objet?

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: Existe-t-il une méthode de ce type dans Jquery?

Merci.

83
thom
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.Push(m)
        }
    }
    return res;
}
65
Makram Saleh

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 d'un objet, tout comme vous pouvez énumérer les propriétés. Ceci (ou quelque chose de proche de cela) 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, vous ne pourrez donc pas trouver la fonction tous sur cet objet.

46
Larry Osterman

Vous pouvez utiliser console.dir(object) pour écrire les propriétés de cet objet dans la console.

27
pstenstrm

Dans les navigateurs modernes, vous pouvez utiliser Object.getOwnPropertyNames pour 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 ceci ne récupère que propres propriétés , ainsi il ne retournera pas les propriétés trouvées ailleurs sur la chaîne de prototypes. Cela, cependant, ne semble pas être votre demande et je vais donc supposer que cette approche est suffisante.

Si vous souhaitez uniquement voir des propriétés énumérables , vous pouvez utiliser plutôt Object.keys . Cela renverrait la même collection, moins la propriété non énumérable constructor.

14
Sampson

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

  console.log(yourJSObject);

ou plus directement

  console.dir(yourJSObject.__proto__);
6
Matoeil

En 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"]
3
Kevin Beal
var funcs = []
for(var name in myObject) {
    if(typeof myObject[name] === 'function') {
        funcs.Push(name)
    }
}

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

2
Matt Greer

le meilleur moyen est:

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

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

2
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.Push(key);
    }
}

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

1
Raynos

pour moi, le seul moyen fiable d'obtenir les méthodes de la dernière classe d'extension était de procéder comme suit:

function getMethodsOf(obj){
  const methods = {}
  Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ).forEach(methodName => {
    methods[methodName] = obj[methodName]
  })
  return methods
}
1
Jo-Go

Obtenir 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];
    });
};
0
sidanmor

Dans Chrome est keys(foo.prototype). Renvoie ["a", "b"].

Voir: https://developer.chrome.com/devtools/docs/commandline-api#keysobjectenter image description here

Édition ultérieure: si vous avez besoin de le copier rapidement (pour les objets plus gros), faites copy(keys(foo.prototype)) et vous l’aurez dans le presse-papier.

0
Șerban Ghiță