2016-04-05 14 views
2

kodeksinde statik yöntem içinden alma Sınıf adını bir statik yöntem içinden almaya çalışıyorum. O değil ben söylemeyi unuttum statik yöntemleSınıf adını

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" 

içinden sıradan bir yöntemle çalışır: o MyNode türetilmiş sınıfları için çalışmalıdır.

+0

kullanabilirsiniz: olmayan statik yöntemde, sen 'kullanabilirsiniz yerine uzun regexp'nin this.constructor.name' –

cevap

5

çözümü aşağıdakileri kontrol edin:

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

türetilmiş sınıfta birden MyNode

0

Geliştirilmiş yöntem, bu sınıfın adını değil alacak.

Aşağıdaki kod polimer 2.0 elemanları

için

Faydalı statik yöntemde sınıf adını almak için:

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 

size verir:

"G" 
1

Önceki cevaplar olacak Bazı durumlarda başarısız

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

her zaman herhangi işlevini özelliğini name kullanabilirsiniz. ES6 clases yüzden, "özel fonksiyonlar" şunlardır:

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

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

sadece Bilginize this.name

İlgili konular