Обращение к методу класса к другому классу

Я не знаю как правильнее описать словами чего я хочу добиться, но могу показать кодом, что я хочу.
Я хочу обратиться к методу как-то вот так:

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 шт):

Автор решения: Arseni Mourzenko

Почти. Если выполните код, который вы написали, то получите ошибку о том, что превысили размер 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();
→ Ссылка