2017-04-20 60 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" 
相關問題