Как мне изменить имя конструктора выражения класса после его определения?

Популярный подход для фальсификации иерархии пространства имен:

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 ответ

Решение
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"
Другие вопросы по тегам