将回调函数传递给原型

时间:2016-02-09 05:12:46

标签: javascript node.js events

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

此时快速了解语法和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)};`

2 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是创建一个返回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,但如果您需要,可以{,1}},bindcall,或者您可以再次创建工厂但在apply

的上下文中创建一个闭包

或者您可以将原型属性传递给this

Object.create

答案 1 :(得分:1)

JavaScript遵循原型继承,

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

2)此外,孩子继承原型,因此您需要继承Function_Name而不是继承自Function_Name.prototype

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');