JavaScript类上的事件或函数

我在一些类中使用EventEmitter ,但是我真的很困惑事件侦听和事件发射是否比调用对象方法更有效率?

我希望对象能够侦听发送给它的大量事件,并且还会向最初将事件发送到对象以及其他对象的对象发出一些事件。

而且我很困惑,是不是应该在什么时候使用函数来调用其他的对象方法等等。

事件改进模块解耦。 这就是这个简单的问题:“我需要触摸多less个文件才能修改或添加特征X?

一个简单的例子:你有一个Web服务器,一个日志模块和一个启动脚本,它们在启动时连接在一起。 函数调用方式如下所示:

 // Startup.js var Startup = function() { var logger = new Logger(); var server = new Server(logger); }; // Logger.js var Logger = function() { }; Logger.prototype.log = function(msg) { console.log(msg); }; // Server.js var Server = function(logger) { this.logger = logger; }; Server.prototype.start() { this.logger.log("Start server..."); }; 

你可以看到Startup知道所有的类,Server知道logging器以及如何使用它。 如果我想重命名logging器的function日志来写我必须触摸logging器和服务器。

现在让我们来看一下事件驱动的方法:

 // Startup.js var Startup = function() { var logger = new Logger(); var server = new Server(); server.addListener(logger); }; // Logger.js var Logger = function() { this.on("startup", function(msg) { console.log(msg); }); }; Logger.prototype.__proto__ = EventEmitter.prototype; // Server.js var Server = function() { }; Server.prototype.start() { this.emit("startup", "Start server..."); }; Server.prototype.__proto__ = EventEmitter.prototype; 

现在Logger和Server不知道对方。 我可以重命名日志,所有我必须触及的是Logger.js。 我甚至可以删除logging器或添加更多的logging器,他们都与服务器。 但我从来没有碰过Server.js。

这是一个简单的例子,解耦在这里看起来不重要。 但是一个项目越大,获得的利益就越多。

你可以unit testing服务器,而不必模拟logging器。 而Logger只是一个依赖。 想象一下,如果服务器有五个或更多的子模块,你必须模拟的优势。

我希望这可以帮助你理解事件驱动架构的好处。