将callback函数传递给原型

试验一个消息模块,该模块将提供在Node应用程序中的几个模块之间发送和侦听事件的方法。 这个尝试是相当新的。 我的目标是初始化一个监听器,并将其直接送入callback函数。

在这一点上,语法和JS原型开始绊倒。

var events = require('events'); var inter_com = new events.EventEmitter(); var com_bus = { initListener:function(listener_name, callback){ this.listener_name = listener_name; this.callback_function = callback; inter_com.on(this.listener_name, this.callback_function); }, sendMessage:function(data){ inter_com.emit(this.listener_name,data); console.log('test event sent'); } } var instance_of_com = Object.create(com_bus); instance_of_com.initListeners('testing',pipeMe); instance_of_com.sendMessage('its good to be the king'); var pipeMe = function(data){console.log(data)};` 

JavaScript遵循原型inheritance,

1)从一个对象inheritance,父亲需要是一个Function.Convention是该函数应该被命名为InitCap ,这表示它是一个构造函数。

2)子也inheritance原型,所以不需要从Function_Nameinheritance,而需要从Function_Name.prototypeinheritance。

 var events = require('events'); var inter_com = new events.EventEmitter(); function Com_bus() { } Com_bus.prototype.initListeners = function(listener_name, callback) { this.listener_name = listener_name; this.callback_function = callback; inter_com.on(this.listener_name, this.callback_function); }; Com_bus.prototype.sendMessage = function(listener_name, callback) { inter_com.emit(this.listener_name, data); console.log('test event sent'); }; var pipeMe = function(data) { console.log(data) }; var instance_of_com = Object.create(Com_bus.prototype); instance_of_com.initListeners('testing', pipeMe); instance_of_com.sendMessage('its good to be the king'); 

解决这个问题的一个方法是创build一个返回com_bus实例的工厂:

 function returnComBusInstance () { // create a closure on these variables var listener_name; var callback_function; return { initListener:function(_listener_name, _callback){ listener_name = _listener_name; callback_function = _callback; inter_com.on(listener_name, callback_function); }, sendMessage:function(data){ inter_com.emit(listener_name, data); console.log('test event sent'); } } } 

接着:

 var com_bus_instance = returnComBusInstance() 

我个人尽量避免使用this但如果你需要的话,你可以bindcallapply ,或者你可以创build一个工厂,但在这个上下文中创build一个闭包

或者你可以将原型属性传递给Object.create

 Object.create(com_bus, { 'listener_name': {value: null, enumerable:true}, 'callback_function': {value:null, enumerable:true} });