【问题标题】:How do I change the constructor name of class expression after its definition?如何在定义后更改类表达式的构造函数名称?
【发布时间】:2017-09-17 09:27:09
【问题描述】:

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

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"

我想在定义后弄乱类名,以便实例的构造函数名称显示为我想要的,但我不知道如何。

【问题讨论】:

  • “但是对计算机来说相当没用” 你希望计算机对类名做什么?

标签: javascript ecmascript-6 classname


【解决方案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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2016-06-10
    • 2016-04-12
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多