2017-04-20 1 views
0

approche populaire pour feindre la hiérarchie des espaces de noms:Comment modifier le nom du constructeur de l'expression de classe après sa définition?

class Stem {}; 
Stem.Branch = class extends Stem {}; 
Stem.Branch.Twig = class extends Stem.Branch {}; 
Stem.Branch.Twig.Leaf = class extends Stem.Branch.Twig {}; 

Faisons un peu d'introspection d'une instance. Ce qui suit a le « mauvais »/résultat inattendu (probablement monte jusqu'à ce qu'il trouve un nom):

» (new Stem.Branch.Twig).constructor.name 
"Stem" 

Je suis autorisé à joindre un nom à l'expression de la classe:

Stem.Branch.Twig = class Stem.Branch.Twig extends Stem.Branch {}; 

mais est une erreur de syntaxe, les identificateurs ne peuvent pas contenir de points, et l'ajout de guillemets n'aide pas. Sans points, il fonctionne au moins pour l'homme, mais est plutôt inutile pour les ordinateurs:

Stem.Branch.Twig = class StemBranchTwig extends Stem.Branch {}; 
» (new Stem.Branch.Twig).constructor.name 
"StemBranchTwig" 

Je veux jouer avec le nom de classe après sa définition, de sorte que le nom du constructeur d'une instance montre que je veux, mais Je ne peux pas comprendre comment.

+1

* "mais est plutôt inutile pour les ordinateurs" * Que voulez-vous que l'ordinateur fasse avec le nom de la classe? –

Répondre

0
function assign_name(moniker) { 
    eval(`Object.defineProperty(${moniker}, 'name', {value: '${moniker}'});`); 
} 

class Stem {}; 

Stem.Branch = class extends Stem {}; 
assign_name('Stem.Branch'); 

Stem.Branch.Twig = class extends Stem.Branch {}; 
assign_name('Stem.Branch.Twig'); 

Stem.Branch.Twig.Leaf = class extends Stem.Branch.Twig {}; 
assign_name('Stem.Branch.Twig.Leaf'); 

» (new Stem.Branch.Twig).constructor.name 
"Stem.Branch.Twig"