2017-01-04 135 views
1

如何從es 6類中的普通成員函數調用靜態函數?在es6中的非靜態成員函數中調用靜態getter javascript class

下面是一個例子:

class Animal { 
    constructor(text) { 
     this.speech = text; 
    } 

    static get name() { 
     return "Animal"; 
    } 

    speak() { 
     console.log(this.name + ":"+ this.speech) 
    } 
} 

class Tiger extends Animal { 
    static get name() { 
     return "Tiger" 
    } 
} 

var animal = new Animal("hey there"); 
animal.speak(); 
var tiger = new Tiger("hello"); 
tiger.speak(); 

// output: 
// undefined:hey there 
// undefined:hello 

我可以改變說話函數返回

speak() { 
    console.log(Animal.name + ":"+ this.speech) 
} 

但這總是輸出從動物類的名字,但我想要的是輸出當前類的靜態名稱屬性(例如子類中的「Tiger」)。我怎樣才能做到這一點?

+1

你可以使用'this.constructor.name',至少在你的情況下將工作(靜態成員是構造函數的屬性和[Object.prototype.constructor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor)正在幫助你療法E)。但是,我不確定這是否是最好的/最乾淨的解決方案。 – ASDFGerte

+0

爲什麼它是靜態的? –

回答

2

添加非靜態get name()Animal類返回this.constructor.name

get name() { 
    return this.constructor.name; 
} 

class Animal { 
 
    constructor(text) { 
 
     this.speech = text; 
 
    } 
 

 
    static get name() { 
 
     return "Animal"; 
 
    } 
 

 
    get name() { 
 
     return this.constructor.name; 
 
    } 
 

 
    speak() { 
 
     console.log(this.name + ":"+ this.speech) 
 
    } 
 
} 
 

 
class Tiger extends Animal { 
 
    static get name() { 
 
     return "Tiger" 
 
    } 
 
} 
 

 
var animal = new Animal("hey there"); 
 
animal.speak(); 
 
var tiger = new Tiger("hello"); 
 
tiger.speak();

+0

謝謝!精美的作品。 –