我正在尝试从静态方法中检索类名。它适用于普通方法,但不适用于静态方法
class MyNode{
constructor(){
var classname=this.constructor.toString().split ('(' || /s+/)[0].split (' ' || /s+/)[1];
console.log(classname);
}
static a_static_method(){
var classname=this.constructor.toString().split ('(' || /s+/)[0].split (' ' || /s+/)[1];
console.log(classname);
}
}
var obj=new MyNode(); // THIS WORKS, prints "MyNode"
MyNode.a_static_method(); // THIS DOESN'T, prints "Function"
我忘了说:它应该适用于MyNode的派生类。
答案 0 :(得分:6)
现在您可以使用this.name
答案 1 :(得分:5)
请检查以下解决方案:
class MyNode{
constructor(){
var classname=this.constructor.toString().split ('(' || /s+/)[0].split (' ' || /s+/)[1];
console.log(classname);
}
static a_static_method(){
var classname = this.toString().split ('(' || /s+/)[0].split (' ' || /s+/)[1];
console.log(classname);
}
}
在派生类中,您将获得该类的名称,而不是MyNode
答案 2 :(得分:2)
以前的答案在某些情况下会失败
class cl_s2{
constructor(){
}
static a_static_method(){
var classname = this.toString().split ('(' || /s+/)[0].split (' ' || /s+/)[1];
console.log(classname);
}
static get is() {
return this.toString().replace(new
RegExp('^class(?: |\n|\r)+([^\s\n\r{]+)[\s\n\r{](?:\s|\n|\r|.)+', 'i'), '$1').trim();
}
static get className() {
let classNameRegEx = /(?:\S+\s+){1}([a-zA-Z_$][0-9a-zA-Z_$]*)/;
return classNameRegEx.exec( this.toString() )[1];
}
}
//Will fail in chrome because toString will return " class cl_s2{ ...", so there will be no "("
cl_s2.a_static_method();
//Will fail in browser which will display "function cl_s2(){" instead
// and in classes with underscore in name
console.log(cl_s2.is);
//this will work as long as you do not use unicode chars in classnames
console.log(cl_s2.className);
答案 3 :(得分:0)
改进方法。
如何在静态方法中获取类名
对聚合物2.0元素有用
以下代码:
class G {
static get is() {
return this.toString().replace(new
RegExp('^class(?: |\n|\r)+([^\s\n\r{]+)[\s\n\r{](?:\s|\n|\r|.)+', 'i'), '$1').trim();
}
};
G.is
给你:
"G"
答案 4 :(得分:-2)
你总是可以在任何函数上使用属性name
。
ES6 Clases是"特殊功能",所以:
class Test {
getClassName() {
return Test.name;
}
}
console.log(new Test().getClassName());