Core.prototype.initChat
this.chat.sendMessage = function(message) {
socket.emit('message', message);
///// ???? что такое socket в этой функции?
return;
};
Я бы на вашем месте определил объекты chat, socket, game - протестировал их, а затем уже расширил Core с их помощью.
чтобы в итоге получилось что-то типа
const core = new Core()
core.extend(chat)
core.extend(socket)
...
Вот это выглядит странно - this.chat = function(){};
Сложно сказать правильно ли вы делаете... Core, chat, socket это синглтоны? если так, то нужно их сделать как синглтоны.
Если нет, то будут ли объекты Core без chat или socket? в общем правильность зависит от результата, который хотите получить.
Добавлю.
chat и socket связаны между собой. без сокета чат невозможен, ну и без чата сокет больше не используется (в этом коде). поэтому это один компонент, нет смысла его разделять и инициализировать как отдельные.
В общем присутствуют структурные непонятки, думаю вам нужно с ними разобраться.