Javascript 调用其他对象函数的Eventmanager

Javascript 调用其他对象函数的Eventmanager,javascript,jquery,Javascript,Jquery,我正在使用javascript和jQuery。我有一个问题,我的web应用程序有不同的视图,像鼠标点击这样的一个动作应该在不同的视图中做不同的事情 我已经创建了一个ActionManager,当触发单击事件时会收到通知。此管理器对象了解当前视图。现在我不希望actionmanager能够在不同的对象中触发函数 我所做的是管理器获取不同对象的实例。这是在初始化时通过注册来完成的,在注册中,他们注册了他们不想处理的事件类型以及他们负责的视图类型 问题是我想让它尽可能通用,这样actionmanage

我正在使用javascript和jQuery。我有一个问题,我的web应用程序有不同的视图,像鼠标点击这样的一个动作应该在不同的视图中做不同的事情

我已经创建了一个ActionManager,当触发单击事件时会收到通知。此管理器对象了解当前视图。现在我不希望actionmanager能够在不同的对象中触发函数

我所做的是管理器获取不同对象的实例。这是在初始化时通过注册来完成的,在注册中,他们注册了他们不想处理的事件类型以及他们负责的视图类型

问题是我想让它尽可能通用,这样actionmanager就不需要知道要调用的函数的名称。然后,不同的实例可以有不同的函数名,而不让actionmanager知道。我可以通过向函数发送引用,让注册部分在该实例中存储该事件的函数名,但我不能这样做:

myfunc : function (myinstance, myfunction)
{
    myinstance.myfunction();
}
这将假定myfunction作为一个函数存在于myinstance中,而不是使用可能是onMouseClick的真实函数名

编辑: 其他人看到这种情况并想知道原因的解释:我之所以使用eventmanager,是因为我只想在需要的元素上添加一个单击事件,而不想更改单击事件代码。我还想只调用一个方法并在该方法中运行代码。我不想调用多个方法,让这些方法根据视图决定是否应该运行。

如果myfunction是字符串: 您可以这样做:

myfunc : function (myinstance, myfunction)
{
    myinstance[myfunction]();
}
myfunc : function (myinstance, myfunction)
{
    myfunction.call(myinstance);
}
对象上的函数只是分配给该对象上的属性的函数对象。在JavaScript中,您可以通过以下两种方式之一访问属性:

使用点符号和属性名称的文字,例如x=obj.foo;,或 使用括号表示法和属性名称字符串,例如x=obj[foo]; 它们做完全相同的事情,但第二种形式当然更灵活——事实上,它的设计正是为了你所描述的情况

如果myfunction是实际的函数对象: 您可以这样做:

myfunc : function (myinstance, myfunction)
{
    myinstance[myfunction]();
}
myfunc : function (myinstance, myfunction)
{
    myfunction.call(myinstance);
}
调用myfunction并确保在调用期间this=myinstance。所有JavaScript函数对象都有一个调用函数和一个应用函数。它们都使用特定的this值来调用函数,但它们在向函数传递参数的方式上有所不同:

使用call时,可以在调用中将它们作为离散参数传递:

使用apply,可以传入一个参数数组:

func.apply(inst, [arg1, arg2, arg3]);
//               ^----------------^---- note that this is an array
例如:

以上所有内容的示例 -既然你说你在使用jQuery,我就为了方便而使用它,但上面的内容都与jQuery无关,这是vanilla JavaScript的工作原理

var myinstance = {
  foo: "bar",
  myfunction: function(arg1, arg2) {
    display("<code>myfunction</code> called, <code>this.foo</code> is: " + this.foo);
    if (arg1) {
      display("<code>arg1</code> is: " + arg1);
    }
    if (arg2) {
      display("<code>arg1</code> is: " + arg2);
    }
  }
};

// Without arguments
callUsingString(myinstance, "myfunction");
sep();
callUsingFunction(myinstance, myinstance.myfunction);
sep();

// With arguments
callUsingStringWithArgs(myinstance, "myfunction", ["one", "two"]);
sep();
callUsingFunctionWithArgs(myinstance, myinstance.myfunction, ["one", "two"]);
sep();

function callUsingString(inst, func) {
  inst[func]();
}

function callUsingFunction(inst, func) {
  func.call(inst);
}

function callUsingStringWithArgs(inst, func, args) {
  // Easier using the function reference:
  callUsingFunctionWithArgs(inst, inst[func], args);
}

function callUsingFunctionWithArgs(inst, func, args) {
  func.apply(inst, args);
}
display只是将一个段落元素附加到具有给定文本的页面上;sep只是附加了一个hr元素

更多阅读:


如果myFunction是一个字符串,您可以这样做

myfunc : function (myinstance, myfunction)
{
    myinstance[myfunction]();
}
但是,如果myFunnction是一个函数对象,则必须调用该函数。其中myFunction中的此对象引用myinstance


可以这样做,但是为什么不使用.bind和.trigger来处理事件呢?演示

谢谢您的回答。你说我应该使用绑定和触发器是什么意思?我使用这个管理器是为了只调用一个方法,而不是在几个类中调用同一个方法。如果你想触发一个事件,你必须知道对象。有绑定触发器的演示,但是你仍然需要注册来保存对象。我认为这是一个比保存对象和方法更好的系统。我认为你误解了我想要什么和不想要什么,或者我误解了你:阅读我帖子中的编辑,我想这解释得更好。然后你可以调用上面写的函数myinstance[myfunction];或myfunction.callmyinstance;谢谢你详细的回答。现在,将函数作为字符串传递的技巧如下:
myfunc : function (myinstance, myfunction)
{
    myfunction.call(myinstance);
}