Модуль JavaScript от фабричного дизайна вместо класса - PullRequest
0 голосов
/ 10 октября 2018

Недавно я пытаюсь освоить JavaScript и пытаюсь понять шаблон фабричного проектирования.При этом я сталкиваюсь с этой проблемой.

У меня есть простой класс логгера, который я экспортирую как модуль, этот класс расширяет класс модуля событий.

const EventClass = require('events');

class Logger extends EventClass { 
    printSomething(something) {
        console.log(something);    
        this.emit('logged', { context: 'not implemented' });
    }
}    
module.exports = Logger;

И он ловит событие здесь

const EventClass = require('events');
const Logger = require('./logger');

logger.on('logged', (arg) => {
    console.log('Listener called', arg);
});
logger.printSomething('something');

Как бы я мог воссоздать этот сценарий, используя шаблон проектирования фабрики вместо того, чтобы расширять класс из класса событий?

Вот мой снимок:

const EventClass = require('events');
const eventObject = new EventClass();

const Log = function () {
    const log = {};
    log.eventObject; // HERE I TRY TO SET THE eventObject TO THE LOG
    log.printSomething = (something) => {
        console.log(something);
        eventObject.emit('logged', { context: 'not implemented' });
    }
    return log;
}

const loggerObject = Log();
module.exports = loggerObject;

И

const EventClass = require('events');
const logger = require('./logger');
logger.eventObject.on('logged', (arg) => {
    console.log('Listener called', arg);
});
logger.printSomething('something');

Я думал, что создавая экземпляр класса событий внутри области действия функции, я смогу сделать logger.eventObject.И я не знаю, как сделать его вложенным объектом.

Stacktrace:

TypeError: Cannot read property 'on' of undefined
    at Object.<anonymous> (C:\Users\Jonas\Desktop\min hjemmeside\index.js:3:20)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Function.Module.runMain (module.js:694:10)
    at startup (bootstrap_node.js:204:16)
    at bootstrap_node.js:625:3

Как сделать событие EventObject доступным после экспорта модуля?

1 Ответ

0 голосов
/ 10 октября 2018

Я обычно не отвечаю на свои вопросы - но я нашел решение.

const EventClass = require('events');
let eventObject = new EventClass();

const Log = function () {
    const log = {};
    log.eventObject = new EventClass(); //I ended up assigning the eventObject like this
    log.printSomething = (something) => {
        console.log(something);
        eventObject.emit('message is logged', { context: 'not implemented' });
    }
    return log;
}
module.exports = Log;

Я все равно приму ответ, если подробное объяснение, почему это работает вопреки предыдущему.

...