Javascript 调用其他对象函数的Eventmanager
我正在使用javascript和jQuery。我有一个问题,我的web应用程序有不同的视图,像鼠标点击这样的一个动作应该在不同的视图中做不同的事情 我已经创建了一个ActionManager,当触发单击事件时会收到通知。此管理器对象了解当前视图。现在我不希望actionmanager能够在不同的对象中触发函数 我所做的是管理器获取不同对象的实例。这是在初始化时通过注册来完成的,在注册中,他们注册了他们不想处理的事件类型以及他们负责的视图类型 问题是我想让它尽可能通用,这样actionmanager就不需要知道要调用的函数的名称。然后,不同的实例可以有不同的函数名,而不让actionmanager知道。我可以通过向函数发送引用,让注册部分在该实例中存储该事件的函数名,但我不能这样做:Javascript 调用其他对象函数的Eventmanager,javascript,jquery,Javascript,Jquery,我正在使用javascript和jQuery。我有一个问题,我的web应用程序有不同的视图,像鼠标点击这样的一个动作应该在不同的视图中做不同的事情 我已经创建了一个ActionManager,当触发单击事件时会收到通知。此管理器对象了解当前视图。现在我不希望actionmanager能够在不同的对象中触发函数 我所做的是管理器获取不同对象的实例。这是在初始化时通过注册来完成的,在注册中,他们注册了他们不想处理的事件类型以及他们负责的视图类型 问题是我想让它尽可能通用,这样actionmanage
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);
}