javascript object - Come ottenere i metodi di un oggetto?





class create (11)


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
}

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.




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



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.




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.




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

  console.log(yourJSObject);

o più direttamente

  console.dir(yourJSObject.__proto__);



il modo migliore è:

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

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




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



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.




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.







jQuery: pensi molto a "QUERYing the DOM " per gli elementi DOM e fai qualcosa.

AngularJS: THE model is the truth, e tu pensi sempre da quell'ANGLE.

Ad esempio, quando si ottengono dati dal server che si intende visualizzare in un formato nel DOM, in jQuery, è necessario '1. TROVA 'dove nel DOM vuoi inserire questi dati, il' 2. AGGIORNA / APPENDA 'lì creando un nuovo nodo o semplicemente impostando il suo innerHTML . Quindi, quando vuoi aggiornare questa vista, allora '3. TROVA 'la posizione e' 4. AGGIORNARE'. Questo ciclo di ricerca e aggiornamento eseguito nello stesso contesto di recupero e formattazione dei dati dal server è disponibile in AngularJS.

Con AngularJS hai il tuo modello (oggetti JavaScript a cui sei già abituato) e il valore del modello ti parla del modello (ovviamente) e della vista, e un'operazione sul modello si propaga automaticamente alla vista, quindi non lo fai Devo pensarci. Ti troverai in AngularJS non trovando più cose nel DOM.

Per dirla in un altro modo, in jQuery, devi pensare ai selettori CSS, cioè, dove è il divo tdche ha una classe o un attributo, ecc., In modo che possa ottenere il loro HTML o colore o valore, ma in AngularJS, ti troverai a pensare in questo modo: di quale modello mi occupo, imposterò il valore del modello sul vero. Non ti preoccuperai se la vista che riflette questo valore è una casella spuntata o risiede in un tdelemento (i dettagli che avresti spesso dovuto pensare in jQuery).

E con la manipolazione del DOM in AngularJS, ti ritrovi ad aggiungere direttive e filtri, che puoi pensare come estensioni HTML valide.

Un'altra cosa che sperimenterai in AngularJS: in jQuery chiami molto le funzioni jQuery, in AngularJS, AngularJS chiamerà le tue funzioni, quindi AngularJS ti dirà come fare le cose, ma i benefici ne valgono la pena, quindi imparare AngularJS di solito significa imparare ciò che AngularJS vuole o il modo in cui AngularJS richiede che tu presenti le tue funzioni e lo chiamerà di conseguenza. Questa è una delle cose che rende AngularJS un framework piuttosto che una libreria.





javascript function object methods get