2015-07-27 12 views
14

Chciałbym uzyskać nazwę klasy nadrzędnej (Parent), ale jestem tylko w stanie odzyskać nazwę klasy dziecko z tego kodu (Child) ...Otrzymujesz nazwę klasy dla rodziców od dziecka z ES6?

'use strict'; 
 

 
class Parent { 
 

 
} 
 

 
class Child extends Parent { 
 

 
} 
 

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

Czy to możliwe ?

Dzięki!

+0

pamiętasz to powiedzieć wcześniej, ale nie sądzę, jest to możliwe. W twoim przykładzie możesz sprawdzić, czy 'instancja' jest instancją' Parent' z 'instanceof'. Co można zrobić, to mieć własną metodę extends, która przechowuje drzewo dziedziczenia na każdym nowo utworzonym obiekcie, ale nie jestem pewien, czy można to zrobić w inny sposób. – Maverick

+0

@Maverick Spróbuję zrobić to tak, jak powiedziałeś, i tak dziękuję za odpowiedź! – Swadon

+0

nie ma problemu :). Zrobię więcej badań, ponieważ jestem ciekawy siebie, ale nie spodziewam się znaleźć eleganckiego rozwiązania. Jeśli coś znajdę, opublikuję tutaj. – Maverick

Odpowiedz

26

Klasy ES6 dziedziczą od siebie. Więc kiedy instance.constructor odnosi się do Child, a następnie można użyć Object.getPrototypeOf (instance.constructor) uzyskać Parent, a następnie uzyskać dostęp .name:

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

Oczywiście, pełna zgodność ES6 i kod non-minified są niezbędne do tego, aby pracować. Nigdy nie powinieneś polegać na nazwach funkcji w kodzie.

+0

Dziękuję za odpowiedź i notatkę! :) – Swadon

+0

Przyjechałem tutaj, aby opublikować to :). Możesz także pójść dalej w górę drzewa, jeśli na przykład 'c' rozszerza' b' rozszerza 'a' :). Dobra wiadomość: istnieje bardzo (bardzo podstawowe) skrzypce ES6: http://www.es6fiddle.net/ – Maverick

+0

@Maverick Dzięki za cynk i wspaniałe przykłady! :) – Swadon

1

Można technicznie zrobić

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

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

pamiętać, że nazwy te czynią wszystko być zniekształcone przez minifiers.

+0

Wykluczyłeś krok od dziecka do rodzica? Jestem zdezorientowany, jak to odpowiada na pytanie (jeśli tak)? – Maverick

+0

Dzięki za odpowiedź, ale jak powiedział @Maverick, nadal potrzebuję nazwy klasy nadrzędnej, aby uzyskać dostęp do tych samych informacji ... Również projekt Node.js, więc minifikacja nie jest problemem – Swadon

+0

Bla, tylko literówka. Druga linia miała być "instanceProto". – loganfsmyth

1

Oto coś zabawnego:

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.

Powiązane problemy