如何在定义后更改类表达式的构造函数名称?

时间:2017-04-20 16:10:48

标签: javascript ecmascript-6 classname

伪造命名空间层次结构的流行方法:

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 :(得分:1)

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"