JavaScript 来自工厂设计的模块而不是 class
JavaScript module from factory design instead of class
最近在自学JavaScript,正在尝试理解工厂设计模式。这样做我遇到了这个问题。
我有一个简单的记录器 class,我将其导出为一个模块,这个 class 扩展了事件模块 class。
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');
我如何才能使用工厂设计模式重新创建此场景,而不是使 class 从事件 class 扩展?
这是我的镜头:
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');
我认为在函数范围内创建事件实例 class,我可以做到 logger.eventObject
。而且我不知道如何使它成为嵌套对象。
堆栈跟踪:
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 可访问?
我通常不回答自己的问题 - 但我找到了解决方案。
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;
如果深入解释为什么这与之前相反,我仍然会接受答案。
最近在自学JavaScript,正在尝试理解工厂设计模式。这样做我遇到了这个问题。
我有一个简单的记录器 class,我将其导出为一个模块,这个 class 扩展了事件模块 class。
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');
我如何才能使用工厂设计模式重新创建此场景,而不是使 class 从事件 class 扩展?
这是我的镜头:
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');
我认为在函数范围内创建事件实例 class,我可以做到 logger.eventObject
。而且我不知道如何使它成为嵌套对象。
堆栈跟踪:
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 可访问?
我通常不回答自己的问题 - 但我找到了解决方案。
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;
如果深入解释为什么这与之前相反,我仍然会接受答案。