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

问题描述 投票:3回答: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.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的派生类。

javascript typescript
5个回答
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


5
投票

现在你可以使用this.name


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);

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"

-2
投票

你可以在任何函数上使用属性name。 ES6类是“特殊功能”,因此:

class Test {
    getClassName() {
        return Test.name;
    }
}

console.log(new Test().getClassName());
© www.soinside.com 2019 - 2024. All rights reserved.