Se è necessario ottenere anche i metodi della superclasse, è possibile chiamare ripetutamente lo Object.getPrototypeOf()
finché non vengono trovati tutti. Probabilmente ti vorresti fermare quando arrivi a Object.prototype
, perché i metodi in là sono fondamentali e di solito non vuoi toccarli con nessun codice che usi la riflessione.
La domanda Get functions (methods) of a class ha una risposta che include una funzione per farlo, ma ha alcuni difetti (incluso l'utilizzo di una condizione di ciclo che ha avuto un effetto collaterale di modificare un argomento di funzione, che immagino rende due scelte di stile di codice discutibili in una sola riga di codice ...), così ho riscritto qui:
export function listMethodNames (object, downToClass = Object)
{
// based on code by Muhammad Umer, https://stackoverflow.com/a/31055217/441899
let props = [];
for (let obj = object; obj !== null && obj !== downToClass.prototype; obj = Object.getPrototypeOf(obj))
{
props = props.concat(Object.getOwnPropertyNames(obj));
}
return props.sort().filter((e, i, arr) => e != arr[i+1] && typeof object[e] == 'function');
}
oltre che fissa il bug nel codice originale (che non copiare l'oggetto in un altro variabile per il ciclo quindi, quando è stato utilizzato per il filtraggio nella riga di ritorno non era più valido) questo fornisce un argomento facoltativo per interrompere l'iterazione in una classe configurabile. Il valore predefinito sarà Object
(quindi i metodi di Object
sono esclusi, se si desidera includerli è possibile utilizzare una classe che non appare nella catena di ereditarietà ... forse la creazione di una classe di marcatori, ad esempio class IncludeObjectMethods{}
, potrebbe avere senso). Ho anche modificato il ciclo do
in un ciclo for
più chiaro e ho riscritto la funzione filtro function ...
vecchio stile in una funzione freccia ES6 per rendere il codice più compatto.
Nel caso non l'iterazione di 'Animal .prototype' lavoro? Da quello che ho capito, l'architettura dell'oggetto sottostante è sempre la stessa del "vecchio" modo. – slebetman
Animal.prototype espone i metodi. Penso che il problema sia nel modo di iterare su di loro. per .. in non sembra funzionare. – seasick