伪造名称空间层次结构的常用方法:

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"


我想在定义后弄乱类名,以使实例的构造函数名如我所愿显示,但我不知道怎么做。

最佳答案

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"

09-25 18:51