从typescript中的静态方法中检索类名

时间:2016-04-05 12:50:08

标签: javascript typescript

我正在尝试从静态方法中检索类名。它适用于普通方法,但不适用于静态方法

 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的派生类。

5 个答案:

答案 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());