我正在使用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?
此代码有效,但在最后一行使用对象实例名称而非 此 似乎很奇怪。
答案 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');