2016-01-03 29 views
5

Ho una classe e un'altra classe che estende quella classe.Ottieni il nome della superclasse in ES6

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

posso ottenere la classe di foo con

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

è possibile ottenere il nome della superclasse di foo ('Shape') in modo simile?

+1

'foo .__ proto __. Constructor.name'? Penso che "__proto__" sia stato standardizzato, anche. –

+2

Questo ti darebbe una classe genitore ma non necessariamente la classe che l'oggetto estendeva direttamente, o quella estesa in origine. – joshstrike

+0

Grazie Jan - questo mi restituisce la classe originale, ma foo.__proto__.__proto__.constructor.name lo ottiene. – joelg

risposta

0

La tua superclasse suprema è sempre Object, quindi non ha senso cercare di derivarla. È necessario verificare se l'istanza in questione è un'istanza di qualcos'altro che utilizza la parola chiave 'is'. Sto scrivendo questo da una prospettiva di Actionscript-3 quindi non sono sicuro di quale sia la sintassi in ES-6 ma dovrebbe essere sulla falsariga di "if (this is Shape)". Ciò restituirebbe true se l'istanza in questione estende la classe di cui stai parlando, altrimenti falso.

Tuttavia, ciò che si sta chiedendo è dove Shape si dirama dalla libreria standard o dall'Oggetto standard e non c'è modo che il compilatore o il runtime possano capirlo. In teoria sarebbe terribilmente bello se le lingue ECMA potessero fornirti una schiera di eredità all'indietro per una determinata classe, ma AFAIK che non è e non è mai stata una caratteristica. Senza la catena completa dell'ereditarietà, è necessario sapere quale superclasse stai cercando o non puoi derivarla in alcun modo logico.

1

capito:

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

Edit: questo restituisce la classe padre, che non è necessariamente il Circolo classe estesa in origine. Nel mio caso d'uso sono uguali, ma c'è una sottile ambiguità sul significato di "superclasse" qui.

+2

'Object.getPrototypeOf' sarebbe più standard di' __proto__'. – loganfsmyth

+1

Questa è la classe genitore immediata, non necessariamente la superclasse che stai cercando. – joshstrike

+0

Ah, grazie. Sono uguali per me, ma posso vedere che non è necessariamente il caso. – joelg

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