在Javascript中自动注册选定方法的触发器回调

在Javascript中自动注册选定方法的触发器回调,javascript,jquery,javascript-events,event-triggers,Javascript,Jquery,Javascript Events,Event Triggers,我需要能够公开事件触发器调用的一个对象的方法。我还想通过为给定对象提供方法及其参数的列表来自动注册这些触发器。以下是我所拥有的(): 函数A(){ } A.原型={ 寄存器:函数(cbname、cbargs、context){ args=['context'].concat(cbargs); var callback=new函数(args,“context.”+cbname+“(“+cbargs.toString()+”;”); $(文档).bind(cbname,回调); document.w

我需要能够公开事件触发器调用的一个对象的方法。我还想通过为给定对象提供方法及其参数的列表来自动注册这些触发器。以下是我所拥有的():

函数A(){
}
A.原型={
寄存器:函数(cbname、cbargs、context){
args=['context'].concat(cbargs);
var callback=new函数(args,“context.”+cbname+“(“+cbargs.toString()+”;”);
$(文档).bind(cbname,回调);
document.write(callback.toString()+“
”); } }; 函数B(){ } B.原型={ 加:功能(左、右){ 文件。书写(l+r); } }; $(函数(){ var a=新的a(); var b=新的b(); a、 寄存器('add',['l','r'],b); $(document.trigger('add',[b,1,2]); });​

创建的回调的代码似乎是正确的:
functionanonymous(context,l,r){context.add(l,r);}
但是当运行时,我在控制台中收到错误消息说
uncaughttypeerror:Object#没有方法“add”
。我做错了什么?

我认为触发事件的第一个参数是事件本身

因此,我认为您需要将register函数中的行更改如下:

args = ['evt', 'context'].concat(cbargs);
(jsFiddle:)

使用函数构造函数创建的函数不会为其创建上下文创建闭包;它们总是在窗口上下文中运行。这是评估的一种形式,所以最好不惜一切代价避免

function A() {}
A.prototype = {
    register: function (name, context) {
        var callback = function () {
            var args = Array.prototype.slice.call(arguments);
            args.shift();
            context[name].apply(context, args);
        };
        $(document).bind(name, callback);
    }
};

function B() {}
B.prototype = {
    add: function (l, r) {
        console.log(l + r);
    }
};

var a = new A(),
    b = new B();

a.register('add', b);
$(document).trigger('add', [2, 3]); // 5

谢谢,这是一个更好的方法。我认为在javascript中,数据和代码之间的区别是模糊的,您有关于
函数
调用性能的任何信息吗?
var callback = new Function(args, "context." + cbname + "(" + cbargs.toString() + ");");
function A() {}
A.prototype = {
    register: function (name, context) {
        var callback = function () {
            var args = Array.prototype.slice.call(arguments);
            args.shift();
            context[name].apply(context, args);
        };
        $(document).bind(name, callback);
    }
};

function B() {}
B.prototype = {
    add: function (l, r) {
        console.log(l + r);
    }
};

var a = new A(),
    b = new B();

a.register('add', b);
$(document).trigger('add', [2, 3]); // 5