【发布时间】:2016-11-02 06:08:27
【问题描述】:
对于查看此问题的任何人,此问题类似于以下内容:
How do I get the name of an object's type in JavaScript?
Get an object's class name at runtime in TypeScript
但在某些方面有所不同。
我正在寻找属于某个类的方法的名称,并将其存储在 TypeScript/JavaScript 中的变量中。
看看下面的设置:
class Foo {
bar(){
// logic
}
}
以上是有效的 TypeScript,我想在另一个类中创建一个方法,该方法将返回 bar() 方法的名称,即 "bar"
例如:
class ClassHelper {
getMethodName(method: any){
return method.name; // per say
}
}
然后我希望能够通过以下方式使用ClassHelper:
var foo = new Foo();
var barName = ClassHelper.getMethodName(foo.bar); // "bar"
我看过很多帖子,有些建议使用以下内容:
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(obj.toString());
var result = results && results.length > 1 && results[1];
但这失败了,因为我的方法不是以function开头的
另一个建议是:
public getClassName() {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(this["constructor"].toString());
return (results && results.length > 1) ? results[1] : "";
}
这只会返回类名,但是从阅读帖子来看,使用constructor 似乎是不可靠的。
另外,当我使用其中一些方法调试代码时,像这样传递方法:ClassHelper.getMethodName(foo.bar); 将导致传递参数,如果该方法采用一个,例如:
class Foo {
bar(param: any){
// logic
}
}
var foo = new Foo();
var barName = ClassHelper.getMethodName(foo.bar); // results in param getting passed through
我已经为此苦苦挣扎了一段时间,如果有人能提供有关我如何解决此问题的任何信息,将不胜感激。
我在传入的方法上的.toString() 返回:
.toString() = "function (param) { // code }"
而不是:
.toString() = "function bar(param) { // code }"
根据 MDN,它也不应该这样做:
即toString对函数进行反编译,返回的字符串包括函数关键字、参数列表、大括号、函数体的来源。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString#Description
【问题讨论】:
标签: javascript regex typescript