2016-04-05 9 views
2

Ich versuche, den Klassennamen innerhalb einer statischen Methode abzurufen. Es funktioniert von einem üblichen Verfahren, aber nicht aus einer statischen MethodeAbrufen des Klassennamens aus der statischen Methode in Typoskript

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" 

sage ich vergessen zu: Es sollte für die abgeleiteten Klassen von MyNode arbeiten.

+0

verwenden FYI: in der nicht statischen Methode können Sie verwenden 'this.constructor.name' statt der langen regexp –

Antwort

5

Bitte überprüfen Lösung folgende:

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

In abgeleiteten Klasse werden Sie den Namen dieser Klasse bekommen, nicht MyNode

0

Verbesserte Methode.

Wie Klassenname in einer statischen Methode

Nützlich für Polymer 2.0 Elemente

Der folgende Code erhalten:

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 

Gibt Ihnen:

"G" 
1

Vorherige Antworten scheitern in bestimmten Fällen

class cl_s2{ 
 
\t 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);

-1

Sie können jederzeit die Eigenschaft name auf jede Funktion. ES6 Clases sind "Sonderfunktionen", so:

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

console.log(new Test().getClassName()); 
0

Jetzt können Sie nur this.name

Verwandte Themen