#javascript #svelte #svelte-component
#javascript #svelte #svelte-component
Вопрос:
import ItemPanel from '../Panel/ItemPanel.svelte';
Если я войду console.log(ItemPanel)
в систему, я получу определение класса:
class ItemPanel extends SvelteComponentDev {
constructor(options) {
super(options);
init(
this,
options
...
Но если я console.log(ItemPanel.name)
, я просто "ItemPanel"
вернусь ко мне.
Я использую имя панели в модальном компоненте, который получает компоненты для открытия, и именно так я идентифицировал их для специальной функциональности. Но потом я понял, что теряю эту функциональность при производственной сборке, потому что я tensor()
редактирую, и это изменяет имя компонента в рабочей среде. Я надеюсь зарегистрировать все свойства, чтобы узнать, есть ли тот, который находится между режимом разработки и режимом производства.
Комментарии:
1.
Object.keys(ItemPanel)
.2. Да! Попробовал это, вернул [] .
Ответ №1:
Я не думаю, что это вопрос, специфичный для Svelte, хотя, конечно, я могу ошибаться.
Отвечая на то, что вы на самом деле спросили, вы можете получить свойства объекта (включая объект функции) через Object.getOwnPropertyNames
(для объектов со строковыми именами) и Object.getOwnPropertySymbols
(для объектов с именами символов). (Напротив, Object.keys
дает вам только подмножество того, что getOwnPropertyNames
дает вам: имена собственных перечислимых свойств со строковыми именами. [ getOwnPropertyNames
включает неисчислимые.]) Чтобы получить унаследованные свойства, используйте Object.getPrototypeOf
, а затем снова используйте первые две функции. Промывайте, повторяйте, пока не достигнете Object.prototype
.
Но переходим к вашему базовому требованию:
ItemPanel
в вашем коде есть функция конструктора. Функции получают свои имена в соответствии с тем, как они определены. Функция-конструктор, созданная с помощью именованного class
объявления или выражения (ваше выглядит как объявление), получает свое имя от имени, заданного для class
. name
Свойство функции дает имя функции.
Если вы каким-то образом сокращаете код, который name
больше не является тем, что вы ищете, и вам нужен какой-то аналогичный уникальный идентификатор, вы можете добавить его с помощью static
поля:
class ItemPanel extends SvelteComponentDev {
static id = "ItemPanel";
// ...
}
Конечно, это означает повторение.
Но отступив на шаг назад:
Я использую имя панели в модальном компоненте, который получает компоненты для открытия…
В этой ситуации я бы использовал фактическую функцию, а не ее имя.
Комментарии:
1. Большое вам спасибо за это объяснение! Я подожду, чтобы узнать, знают ли какие-нибудь стройные ребята что-нибудь, но на самом деле это показало мне необходимые мне реквизиты, и, к сожалению, ни один из них не может помочь. Мы не определяем классы, как вы показали в примере с
static id
присваиванием, поэтому то, что я сделаю (теперь, когда я могу это оправдать), это просто передам имя самого компонента при создании модального. Спасибо!