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

时间:2011-12-18 07:41:56

标签: javascript events mootools options

我正在使用Mootools中的 Implements:[Events,Options]

我想将一个类属性传递给事件触发时调用的函数。我原以为我可以使用 来完成,但 未定义。

我已经在下面的代码中评论了我的问题所在。我觉得这可能与绑定有关,所以我现在就看一下。在此先感谢您的帮助!

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?

此代码有效,但在最后一行使用对象实例名称而非 似乎很奇怪。

2 个答案:

答案 0 :(得分:1)

当您点击活动时, 您的ryan实例。 为了使其工作,只需进行以下更改

function greet(name){
    log('Hello, I am ' + this.options.name); //<-- use this here 
}

ryan.fireEvent('arrive');

但由于问候现在取决于实例,最好将其包含在类定义中

var Person = new Class({

    Implements: [Options, Events],

    initialize: function(options){
        this.setOptions(options);
    },
    greet: function() { log('Hello, I am ' + this.options.name); //<-- use this here  }
});

var ryan = new Person({
    name: 'Ryan',
    onArrive: this.greet.bind(this)  //or a function() { /* log('Hello,... */}
});

答案 1 :(得分:0)

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');