如何找到方法所属的实例?

时间:2010-06-21 13:38:44

标签: javascript

//缩小基类代码(如果需要未压缩的代码,我会发布它)     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')?有更好的方法吗?

1 个答案:

答案 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的观察结果。谢谢!