Обращение к методу класса к другому классу
Я не знаю как правильнее описать словами чего я хочу добиться, но могу показать кодом, что я хочу.
Я хочу обратиться к методу как-то вот так:
const test = new Vk('...');
test.messages.getDialogs();
test.status.set('...');
Как такое можно провернуть? Делается ли это как-то так:
class Vk
{
constructor(token, version = 5.95)
{
this.token = token;
this.version = version;
this.messages = new VkMessages();
this.status = new VkStatus();
}
}
class VkMessages
{
getDialogs()
{
/* тут должно использоваться this.token, this.version взятое из класса Vk */
}
}
class VkStatus
{
set()
{
/* тут должно использоваться this.token, this.version взятое из класса Vk */
}
}
... или как-то иначе?
Ответы (1 шт):
Почти. Если выполните код, который вы написали, то получите ошибку о том, что превысили размер call stack. Почему так? Просто потому что конструктор Vk инициализирует VkMessages, а тот в свою очередь extend класс Vk. Таким образом, конструктор Vk выполняется вновь и вновь, пока есть место в call stack-е, а когда места больше нет, то появляется ошибка.
Но ведь VkMessages вовсе не нужно extend класс Vk, так ведь? Следовательно делаем крохотное изменение в вашем коде, и получаем работающий вариант:
class Vk
{
constructor(token, version = 5.95)
{
this.token = token;
this.version = version;
this.messages = new VkMessages();
}
}
class VkMessages // ← Вот тут изменение.
{
getDialogs()
{
return [];
}
}
const test = new Vk('');
test.messages.getDialogs();
Вот более полный пример, где token и version передвинуты в отдельный класс, который представляет из себя контекст программы, и передается от Vk к VkMessages.
class VkContext
{
constructor(token, version = 5.95)
{
this.token = token;
this.version = version;
}
}
class Vk
{
constructor(context)
{
this.context = context;
this.messages = new VkMessages(context);
}
}
class VkMessages
{
constructor(context)
{
this.context = context;
}
getDialogs()
{
return [];
}
}
const context = new VkContext('');
const test = new Vk(context);
test.messages.getDialogs();