//缩小基类代码(如果需要未压缩的代码,我会发布它) function Class(){} Class.prototype.construct = function(){}; Class.extend = function(c){var a = function(){arguments [0]!== Class&& this.construct.apply (this,arguments)},d = new this(Class),f = this.prototype; for(var e in c){var b = c [e]; if(b instanceof Function)b。$ = f; d [e] = b} a.prototype = d; a.extend = this.extend; return a};
// custom event class
var Event = Class.extend({
handlers: [],
// stores the event handler
subscribe: function(handler, thisObj) {
this.handlers.push([handler, thisObj]);
},
// calls the event handlers
fire: function() {
for(i in this.handlers) {
var handler = this.handlers[i];
handler[0].apply(handler[1]);
}
}
});
var Class2 = Class.extend({
myEvent: new Event(), // the event
test: function() { // fires the event
this.myEvent.fire(this);
}
});
var Class3 = Class.extend({
construct: function(model) {
this.name = "abc";
model.myEvent.subscribe(this.handler, this); // subscribe to the event
},
handler: function() {
alert(this.name); // alerts 'abc'
}
});
var instance1 = new Class2();
var instance2 = new Class3(instance1);
instance1.test();
使事件处理程序代码与好'this'一起工作的唯一方法是在'subscribe'方法中添加一个新参数('thisObj')?有更好的方法吗?
答案 0 :(得分:2)
您获得的行为是由于当您将“方法”传递给函数时,接收函数不知道它是一种方法。它只是一个需要执行的javascript块。
Prototype使用bind
方法解决了这个问题
你可以通过使用闭包来获得类似的行为(我没有看到bind的实现细节)。
var Class3 = Class.extend({
construct: function(model) {
this.name = "abc";
//model.myEvent.subscribe(this.handler, this); // subscribe to the event
var self = this;
model.myEvent.subscribe(function() {self.handler()});
},
handler: function() {
alert(this.name); // alerts 'abc'
}
});
或者将一些类似的功能应用于自定义事件类的subscribe方法。
已编辑反映CMS的观察结果。谢谢!