[Javascript] Come ottenere i metodi di un oggetto?



Answers

Ricorda che tecnicamente gli oggetti javascript non hanno metodi. Hanno proprietà, alcune delle quali possono essere oggetti funzionali. Ciò significa che è possibile enumerare i metodi in un oggetto proprio come è possibile 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 a questo perché alcune proprietà degli oggetti non sono enumerabili, quindi non sarai in grado di trovare ogni funzione sull'oggetto.

Question

Esiste un metodo o proprietà per ottenere tutti i metodi da un oggetto? Per esempio:

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

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

AGGIORNAMENTO: esiste un metodo simile in Jquery?

Grazie.




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

Puoi semplicemente eseguire il looping del prototipo di un costruttore ed estrarre tutti i metodi.




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

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



Nei browser moderni è possibile utilizzare Object.getOwnPropertyNames per 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 proprietà proprie , quindi non restituirà le proprietà trovate altrove sulla catena del prototipo. Tuttavia, questa non sembra essere la tua richiesta, quindi presumo che questo approccio sia sufficiente.

Se si desidera visualizzare solo le proprietà enumerabili , è possibile utilizzare Object.keys . Ciò restituirebbe la stessa collezione, meno la proprietà del constructor non enumerabile.







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





Links