2017-01-04 11 views
1

静的関数をes 6クラス内の通常のメンバー関数から呼び出すにはどうすればよいですか?私はes6の静的でないメンバー関数内で静的なgetterを呼び出すjavascriptクラス

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

しかし、これは動物クラスからの出力名を常に希望を返すように話すの機能を変更することができ

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 

、しかし、私が欲しいのは、出力に次のとおりです。ここで

は一例です現在のクラスの静的nameプロパティ(サブクラス内の "Tiger"など)どうやってやるの?

+1

(静的メンバーはコンストラクタ関数のプロパティであり、[Object.prototype.constructor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor)はあなたを助けていますザールe)。しかし、私はそれが最高の/クリーンな解決策であるかどうかは不明です。 – ASDFGerte

+0

なぜそれは静的ですか? –

答えて

2

this.constructor.nameを返しAnimalクラスに非静的get name()を追加します:あなたは、少なくともそのでしょう、あなたの場合には、 `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

ありがとう!美しく動作します。 –

関連する問題