Come ottenere i metodi di un oggetto?


Risposte:


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

2
La for..invia è l'approccio standard.
Makram Saleh

1
Grazie per la tua modifica, Chris! Penso che ti piaccia TypeErrors…TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
Julian F. Weinert

Il codice è ora fissato con parentesi quadre. Ci dispiace per l'inconvenienza.
Makram Saleh

Aggiunto l'ordinamento dell'array per comodità.
SomeGuyOnAComputer

c'è differenza se valuti la condizione m instanceof Function?
Jose

46

Ricorda che tecnicamente gli oggetti javascript non hanno metodi. Hanno proprietà, alcune delle quali possono essere oggetti funzione. Ciò significa che puoi enumerare i metodi in un oggetto proprio come puoi enumerare le proprietà. Questo (o qualcosa di simile a questo) dovrebbe funzionare:

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

Ci sono delle complicazioni perché alcune proprietà degli oggetti non sono enumerabili, quindi non sarai in grado di trovare tutte le funzioni dell'oggetto.


2
forse stava parlando di console.log. Grazie.
Thom

2
Sì, non faccio JS tutti i giorni quindi non sono al 100% su di esso. Ma capisco la lingua ..
ReinstateMonica Larry Osterman

27

È possibile utilizzare console.dir(object)per scrivere le proprietà degli oggetti nella console.


17

Nei browser moderni è possibile utilizzare Object.getOwnPropertyNamesper ottenere tutte le proprietà (sia enumerabili che non enumerabili) su un oggetto. Per esempio:

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

Si noti che questo recupera solo le proprietà proprie , quindi non restituirà le proprietà trovate altrove nella catena del prototipo. Questa, tuttavia, non sembra essere la tua richiesta, quindi presumo che questo approccio sia sufficiente.

Se desideri visualizzare solo proprietà enumerabili , puoi invece utilizzare Object.keys. Ciò restituirà la stessa raccolta, meno la constructorproprietà non enumerabile .


6

I metodi possono essere controllati nella catena del prototipo dell'oggetto utilizzando gli strumenti di sviluppo del browser (F12):

  console.log(yourJSObject);

o più direttamente

  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

per me, l'unico modo affidabile per ottenere i metodi della classe di estensione finale, era fare in questo modo:

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

Sono su un telefono senza punto e virgola :) ma questa è l'idea generale.


4
Quale telefono non ha punti e virgola ma ti consente di rispondere alle domande? LOL
Hogan

Penso che un nuovo telefono sia il tuo nome con due punti !
Programmi Redwolf

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

Puoi semplicemente eseguire il loop sul prototipo di un costruttore ed estrarre tutti i metodi.


Questo non terrà conto dei metodi direttamente collegati all'oggetto
Matt Greer

@ MattGreer il suo esempio ha chiamato un metodo su un costruttore. Se vuole metodi da un costruttore o da un oggetto è una questione diversa.
Raynos

1

il modo migliore è:

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

usa 'let' solo in es6, usa invece 'var'


1
Restituisce un elenco degli attributi.
Ali Ben Messaoud

Come ha alluso Ali, questo esclude le funzioni definite come getter / setter su una classe (metodi).
Shaun,


0

Ottieni i nomi dei metodi:

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

Oppure, ottieni i metodi:

var getMethods     = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    })).map(function (key) {
        return obj[key];
    });
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.