2016-01-03 19 views
5

Mam klasę i inną klasę, która rozszerza tę klasę.Uzyskaj nazwę superklasy w ES6

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

mogę uzyskać klasę Foo z

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

Czy to możliwe, aby uzyskać nazwę nadrzędnej Foo ('Shape') w podobny sposób?

+1

'foo .__ proto __. Constructor.name'? Myślę, że '_proto__' został ujednolicony, nawet. –

+2

To da ci klasę rodzicielską, ale niekoniecznie klasę, którą obiekt rozszerzał bezpośrednio, lub ten, który pierwotnie rozszerzał. – joshstrike

+0

Dziękuję Jan - to daje mi oryginalną klasę ponownie, ale dostaje ją foo.__proto__.__proto__.constructor.name. – joelg

Odpowiedz

0

Twoja ostateczna nadklasa to zawsze Obiekt, więc nie ma sensu próbować jej wyprowadzać. Musisz sprawdzić, czy dana instancja jest instancją czegoś innego, używając słowa kluczowego "jest". Piszę to z perspektywy Actionscript-3, więc nie jestem pewien, jaka jest składnia ES-6, ale powinna ona być zgodna z "if (this's Shape)". Zwróciłoby to wartość true, jeśli instancja, o której mowa, rozszerza klasę, o której mówisz, w przeciwnym razie false.

Jednak to, o co pytasz, to miejsce, w którym Shape rozgałęzia się od standardowej biblioteki lub standardowego obiektu i nie ma możliwości, aby kompilator lub środowisko wykonawcze mogło to zrozumieć. Teoretycznie byłoby bardzo fajnie, gdyby języki ECMA dały ci wsteczną tablicę dziedziczenia dla danej klasy, ale AFAIK, która nie jest i nigdy nie była funkcją. Bez pełnego łańcucha dziedziczenia musisz wiedzieć, jakiej nadklasy szukasz, lub nie możesz jej wyprowadzić w żaden logiczny sposób.

1

Got go:

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

Edit: ten zwraca klasę nadrzędną, która niekoniecznie jest Krąg klasa rozszerzony pierwotnie. W moim przypadku użycia są one takie same, ale istnieje subtelna dwuznaczność co do znaczenia "nadklasy".

+2

'Object.getPrototypeOf' będzie bardziej standardowe niż' __proto__'. – loganfsmyth

+1

To jest bezpośrednia klasa rodziców, niekoniecznie klasa nadrzędna, której szukasz. – joshstrike

+0

Ah, dzięki. Są dla mnie takie same, ale widzę, że niekoniecznie tak jest. – joelg

3
Object.getPrototypeOf(Object.getPrototypeOf(foo)).constructor.name;