2015-07-27 15 views
14

Vorrei ottenere il nome di classe genitore (Parent), ma sono solo in grado di recuperare il nome della classe bambino con questo codice (Child) ...Ottieni il nome della classe padre da bambino con ES6?

'use strict'; 
 

 
class Parent { 
 

 
} 
 

 
class Child extends Parent { 
 

 
} 
 

 
var instance = new Child(); 
 
console.log(instance.constructor.name);

Is è possibile?

Grazie!

+0

dimenticato di dire prima, ma io non credo che questo sia possibile. Nel tuo esempio, puoi verificare se 'instance' è un'istanza di' Parent' con 'instanceof'. Quello che potresti fare è avere il tuo metodo extends che memorizza l'albero di ereditarietà su ogni oggetto appena creato, ma non sono sicuro di un altro modo per farlo. – Maverick

+0

@Maverick Proverò a farlo come hai detto, grazie comunque per la risposta! – Swadon

+0

nessun problema :). Farò qualche altra ricerca perché sono curioso di me stesso, ma non mi aspetto di trovare una soluzione elegante. Se trovo qualcosa, pubblicherò di nuovo qui. – Maverick

risposta

26

Le classi ES6 si ereditano l'una dall'altra. Così, quando si riferisce alla instance.constructorChild, quindi è possibile utilizzare per ottenere il Object.getPrototypeOf (instance.constructor)Parent, e quindi accedere .name:

Object.getPrototypeOf(instance.constructor).name == "Parent"; 

Naturalmente, la piena conformità ES6 e il codice non minimizzato sono necessari per far funzionare tutto questo. Non dovresti mai fare affidamento sui nomi di funzioni nel codice.

+0

Grazie per la risposta e la nota! :) – Swadon

+0

È venuto qui per pubblicare questo :). Puoi anche andare più in alto nell'albero se, ad esempio, 'c' estende' b' estende 'a' :). Inoltre, buone notizie, c'è un violino ES6 (molto semplice): http://www.es6fiddle.net/ – Maverick

+0

@Maverick Grazie per il suggerimento e gli splendidi esempi! :) – Swadon

1

Si potrebbe tecnicamente fare

// instanceProto === Child.prototype 
var instanceProto = Object.getPrototypeOf(instance); 

// parentProto === Parent.prototype 
var parentProto = Object.getPrototypeOf(instanceProto); 
console.log(parentProto.constructor.name); 

tenere a mente che questi nomi fanno tutti essere alterati da minifiers.

+0

Hai escluso qualsiasi passaggio per passare dal figlio al genitore? Sono confuso su come questo risponde alla domanda (se lo fa)? – Maverick

+0

Grazie per la risposta, ma come ha detto @Maverick, ho ancora bisogno del nome della classe genitore per accedere alle stesse informazioni ... Inoltre, progetto Node.js, quindi la minificazione non è un problema – Swadon

+0

Blah, solo un refuso. La seconda linea doveva essere 'instanceProto'. – loganfsmyth

1

Ecco qualcosa di divertente:

class J {} 
 
    
 
class K extends J {} 
 

 
class L extends K {} 
 

 
function getBaseClass(targetClass){ 
 
    if(targetClass instanceof Function){ 
 
    let baseClass = targetClass; 
 

 
    while (baseClass){ 
 
     const newBaseClass = Object.getPrototypeOf(baseClass); 
 

 
     if(newBaseClass && newBaseClass !== Object && newBaseClass.name){ 
 
     baseClass = newBaseClass; 
 
     }else{ 
 
     break; 
 
     } 
 
    } 
 

 
    return baseClass; 
 
    } 
 
} 
 

 
console.log(getBaseClass(L)); // Will return J.

Problemi correlati