Per chiunque la visione di questo, questa domanda è simile al seguente:Ottiene il nome di metodo di classe a macchina
How do I get the name of an object's type in JavaScript?
Get an object's class name at runtime in TypeScript
Tuttavia è diverso in alcuni aspetti.
Sto cercando di ottenere il nome del metodo che appartiene a una classe e di memorizzarlo in una variabile in TypeScript/JavaScript.
Date un'occhiata al seguente configurazione:
class Foo {
bar(){
// logic
}
}
Quanto sopra è valido dattiloscritto e vorrei creare un metodo in una classe diversa che mi restituirà il nome del metodo bar()
, cioè "bar"
esempio :
class ClassHelper {
getMethodName(method: any){
return method.name; // per say
}
}
vorrei poi essere in grado di utilizzare il ClassHelper
nel seguente modo:
var foo = new Foo();
var barName = ClassHelper.getMethodName(foo.bar); // "bar"
Ho guardato un sacco di messaggi, alcuni suggeriscono usando la seguente:
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(obj.toString());
var result = results && results.length > 1 && results[1];
ma questo viene a mancare come i miei metodi non iniziano con function
un altro suggerimento era:
public getClassName() {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(this["constructor"].toString());
return (results && results.length > 1) ? results[1] : "";
}
Questo restituisce solo il nome della classe e, dalla lettura dei post, sembra che l'utilizzo di constructor
non sia affidabile.
Inoltre, quando ho il debug del codice usando alcuni di questi metodi, passando nel metodo in questo modo: ClassHelper.getMethodName(foo.bar);
si tradurrà nel parametro essere passato se il metodo prende uno, ad esempio:
class Foo {
bar(param: any){
// logic
}
}
var foo = new Foo();
var barName = ClassHelper.getMethodName(foo.bar); // results in param getting passed through
I Ho lottato con questo per un po ', se qualcuno ha qualche informazione su come posso risolvere questo sarebbe molto apprezzato.
mio .toString()
sul metodo passata restituisce questo:
.toString() = "function (param) { // code }"
piuttosto che:
.toString() = "function bar(param) { // code }"
e secondo MDN che non è supposto per uno:
Quello is, toString decompila la funzione e la stringa restituita include la parola chiave function, l'elenco di argomenti, parentesi graffe e t lui fonte del corpo della funzione.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString#Description
Questa soluzione potrebbe avere uno svantaggio quando sono coinvolti vecchi browser e parole chiave riservate, dato che lambda potrebbe compilare 'foo [" default "]'. Altrimenti sembra buono. –
è possibile modificare la funzione lambda in una funzione normale, credo: 'function() {return foo.bar; } ' – Colum