如何在定义后更改 class 表达式的构造函数名称?
How do I change the constructor name of class expression after its definition?
伪造命名空间层次结构的流行方法:
class Stem {};
Stem.Branch = class extends Stem {};
Stem.Branch.Twig = class extends Stem.Branch {};
Stem.Branch.Twig.Leaf = class extends Stem.Branch.Twig {};
让我们对一个实例进行一些反思。以下是 "wrong"/意想不到的结果(可能它会爬升直到找到名称):
» (new Stem.Branch.Twig).constructor.name
"Stem"
我可以为 class 表达式附加一个名称:
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"
我想在定义后修改 class 名称,以便实例的构造函数名称按我的意愿显示,但我不知道该怎么做。
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"
伪造命名空间层次结构的流行方法:
class Stem {};
Stem.Branch = class extends Stem {};
Stem.Branch.Twig = class extends Stem.Branch {};
Stem.Branch.Twig.Leaf = class extends Stem.Branch.Twig {};
让我们对一个实例进行一些反思。以下是 "wrong"/意想不到的结果(可能它会爬升直到找到名称):
» (new Stem.Branch.Twig).constructor.name
"Stem"
我可以为 class 表达式附加一个名称:
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"
我想在定义后修改 class 名称,以便实例的构造函数名称按我的意愿显示,但我不知道该怎么做。
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"