2017-04-20 38 views
0

为伪造命名空间层次流行的做法:如何在定义之后更改类表达式的构造函数名称?

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

让我们做一个实例的一些反思。下面有“错误”的/不希望的结果(可能是攀爬,直到找到一个名称):

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

允许我一个名字附加到类表达式:

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

但这语法错误,标识符不能包含点,并且引用不起作用。如果没有点,它至少适用于人类,相反却是无用的计算机:

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

我想惹它的定义之后类的名称,这样一个实例的构造函数名称显示为我的愿望,但我无法弄清楚如何。

+1

*“但是对电脑来说没用”*您希望计算机如何处理类名? –

回答

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" 
相关问题