2016-01-03 12 views
5

私はクラスとそのクラスを拡張する別のクラスを持っています。ES6でスーパークラス名を取得

class Shape { 
    constructor() { 
    return this; 
    } 
} 
class Circle extends Shape { 
    constructor() { 
    super(); 
    return this; 
    } 
} 
let foo = new Circle(); 

私は

let className = foo.constructor.name 
// returns string 'Circle' 

と、fooのクラスを取得することができ、同様の方法で、fooのスーパークラス(「形」)の名前を取得することが可能ですか?

+1

'foo .__ proto __。constructor.name'?私は '__proto__'も標準化されていると思います。 –

+2

それはあなたに親クラスを与えますが、必ずしもオブジェクトが直接拡張していたクラスである必要はなく、元々拡張したクラスである必要はありません。 – joshstrike

+0

ありがとうJan - 元のクラスをもう一度返しますが、foo.__proto__.__proto__.constructor.nameはそれを取得します。 – joelg

答えて

0

あなたの究極のスーパークラスは常にObjectです。したがって、それを派生させることは何もありません。問題のインスタンスが 'is'キーワードを使って他のもののインスタンスであるかどうかを調べる必要があります。私はActionscript-3の観点からこれを書いているので、構文がES-6でどうなっているのかは分かりませんが、if(this is Shape)の行に沿っているはずです。問題のインスタンスがあなたが話しているクラスを拡張する場合はtrueを返し、それ以外の場合はfalseを返します。

しかし、あなたが求めているのは、Shapeが標準ライブラリや標準オブジェクトから分岐するところであり、コンパイラやランタイムがそれを理解できる方法はありません。理論的には、もしECMA言語があなたに与えられたクラスの継承の後方配列を与えることができればすごくうれしいですが、AFAIKはそうではなく、決して特徴ではありません。継承の完全な連鎖がなければ、あなたが探しているスーパークラスを知る必要があります。そうでなければ、それを論理的な方法で派生することはできません。

1

はそれを手に入れた:

let superClassName = foo.__proto__.__proto__.constructor.name 
// return Shape 

編集:これは必ずしも、元々の拡張クラスのサークルではない親クラスを返します。私の使用例では同じですが、ここでは「スーパークラス」の意味について微妙なあいまいさがあります。

+2

'Object.getPrototypeOf'は' __proto__'よりも標準的です。 – loganfsmyth

+1

これは、直接の親クラスであり、必ずしもあなたが探しているスーパークラスではありません。 – joshstrike

+0

ああ、ありがとう。彼らは私にとっても同じですが、必ずしもそうではないことがわかります。 – joelg

3
Object.getPrototypeOf(Object.getPrototypeOf(foo)).constructor.name; 
関連する問題