2016-04-05 6 views
2

静的メソッド内からクラス名を取得しようとしています。それはではなく、私が言うのを忘れて、静的メソッドタイプスクリプト内の静的メソッド内からクラス名を取得します

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

を使用することができます非静的メソッドでは、 '代わりにその長い正規表現のthis.constructor.name'を使用することができます –

答えて

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

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" 
1

前の回答をします場合によっては失敗する

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

いつでも任意の関数のプロパティnameを使用することができます。 ES6 Clasesので、「特別な機能」です。

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

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

今、あなたはちょうどFYI this.name

関連する問題