Javascript 如何在Mootools fireEvent函数的第二个参数中访问对象实例?

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

我正在使用Mootools中的实现:[事件,选项]

我想将一个类属性传递给事件触发时调用的函数。我本以为我可以用这个来做,但是这个没有定义

我已经在下面的代码中注释了我的问题所在。我有一种感觉,这可能与绑定有关,因此我现在将对此进行研究。提前感谢您的帮助

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