Javascript 如何在Mootools fireEvent函数的第二个参数中访问对象实例?
我正在使用Mootools中的实现:[事件,选项] 我想将一个类属性传递给事件触发时调用的函数。我本以为我可以用这个来做,但是这个没有定义 我已经在下面的代码中注释了我的问题所在。我有一种感觉,这可能与绑定有关,因此我现在将对此进行研究。提前感谢您的帮助Javascript 如何在Mootools fireEvent函数的第二个参数中访问对象实例?,javascript,events,mootools,options,Javascript,Events,Mootools,Options,我正在使用Mootools中的实现:[事件,选项] 我想将一个类属性传递给事件触发时调用的函数。我本以为我可以用这个来做,但是这个没有定义 我已经在下面的代码中注释了我的问题所在。我有一种感觉,这可能与绑定有关,因此我现在将对此进行研究。提前感谢您的帮助 var Person = new Class({ Implements: [Options, Events], initialize: function(options){ this.setOptions(o
var Person = new Class({
Implements: [Options, Events],
initialize: function(options){
this.setOptions(options);
}
});
greet = function(name){
log('Hello, I am ' + name);
}
var ryan = new Person({
name: 'Ryan',
onArrive: greet //add event 'arrive'
});
ryan.fireEvent('arrive', ryan.options.name); //ideally I would use this.options.name?
此代码可以工作,但在最后一行中使用对象实例名称而不是This似乎很奇怪。This关键字指的是当前对象。在您的例子中,
此
可能指的是全局对象(窗口)。您必须在ryan
实例范围内,以便您可以将ryan
称为this
:
function fireEvent(e){
this.fireEvent(e,this.options.name);
}
fireEvent.call(ryan,'arrive');
如果不想再次使用对同一实例的引用,还可以重载fireEvent
方法。大概是这样的:
var originalFireEvent = Person.prototype.fireEvent;
Person.prototype.fireEvent = function(e,o){
var a = typeof this.options[o] !== 'undefined' ? this.options[o] : null;
return originalFireEvent.call(this,e,a);
}
ryan.fireEvent('arrive','name');
然后这样称呼它:
var originalFireEvent = Person.prototype.fireEvent;
Person.prototype.fireEvent = function(e,o){
var a = typeof this.options[o] !== 'undefined' ? this.options[o] : null;
return originalFireEvent.call(this,e,a);
}
ryan.fireEvent('arrive','name');
此
关键字引用当前对象。在您的例子中,此
可能指的是全局对象(窗口)。您必须在ryan
实例范围内,以便您可以将ryan
称为this
:
function fireEvent(e){
this.fireEvent(e,this.options.name);
}
fireEvent.call(ryan,'arrive');
如果不想再次使用对同一实例的引用,还可以重载fireEvent
方法。大概是这样的:
var originalFireEvent = Person.prototype.fireEvent;
Person.prototype.fireEvent = function(e,o){
var a = typeof this.options[o] !== 'undefined' ? this.options[o] : null;
return originalFireEvent.call(this,e,a);
}
ryan.fireEvent('arrive','name');
然后这样称呼它:
var originalFireEvent = Person.prototype.fireEvent;
Person.prototype.fireEvent = function(e,o){
var a = typeof this.options[o] !== 'undefined' ? this.options[o] : null;
return originalFireEvent.call(this,e,a);
}
ryan.fireEvent('arrive','name');
当您触发事件时,这是您的ryan实例。 要使其工作,只需进行以下更改
function greet(name){
log('Hello, I am ' + this.options.name); //<-- use this here
}
ryan.fireEvent('arrive');
当您触发事件时,这是您的ryan实例。 要使其工作,只需进行以下更改
function greet(name){
log('Hello, I am ' + this.options.name); //<-- use this here
}
ryan.fireEvent('arrive');
这不是很无聊,这不是fireEvent的工作方式-默认情况下,回调绑定到实例而不是窗口。我不是在谈论
fireEvent
函数中的引用,而是在设置参数时的引用(您可以在任何其他范围内调用您的函数)。这与工具无关。。这一切都是关于标准javascript的。当您更改fireEvent方法的原型时,这一切都与mootools有关。使其始终绑定到实例,而不必。。。正确/公认的方法是@jermel建议的方法。是的,在javascript中,您可以做任何您喜欢的事情,但这并不意味着在mootools类及其实例的上下文中这样做是正确的您正在终止规范行为,请参见arg 3(延迟)。您应该添加一个新方法fireCustomEvent,该方法依赖于原始协议。这不是很简单,这不是fireEvent的工作方式-默认情况下,回调绑定到实例而不是窗口。我不是在谈论fireEvent
函数中的引用,而是关于设置参数时的引用(您可以在任何其他作用域中调用您的函数)。这与mootools无关。。这都是关于标准javascript的。当您更改fireEvent方法的原型时,这一切都与mootools有关。当它不一定要绑定到实例时,让它始终绑定到实例…正确/可接受的方法是@jermel建议的。是的,在javascript中,您可以做任何您喜欢的事情,不是吗这并不意味着在mootools类及其实例的上下文中这样做是正确的。-您正在消除规范行为,请参见arg 3(延迟)。您应该添加一个依赖于原始proto的新方法fireCustomEvent