1

我正在尝试从作为回调传递的方法内部访问对象的成员变量,该回调在文件读取器事件期间触发。

我将下面的代码拼凑在一起,只是为了尝试传达我的观点。看起来“this”成为文件读取器而不是调用点的对象。有没有办法让 finishLoading 能够访问对象变量?

我想确保回调是针对对象量身定制的,否则我只会将它们定义为类外的静态函数。

function myClass(newName)
{
    this.name = newName;
    this.m_fileReader = new FileReader();

    this.finishedLoading = 
        function(param1)
        {
            alert(this.name);
        };

    this.m_fileReader.addEventListener('loadend',  
                                       this.callback_finishedLoading, 
                                       false);
}

var instance = new myClass('timmy');
var instance2 = new myClass('joe');
4

3 回答 3

4

你需要的.bind功能:

this.m_fileReader.addEventListener('loadend',
    this.callback_finishedLoading.bind(this),
    false);

.bind函数将采用传递的参数,并使用该参数this而不是浏览器尝试提供的任何值来调用原始函数。

或者,只需创建自己的别名this并将调用包装在匿名函数中:

var self = this;
this.m_fileReader.addEventListener('loadend', function(ev) { 
    self.callback_finishedLoading(ev)
}, false);

后者主要.bind在幕后工作,但它确实具有可以在没有 shim 的 ES5 之前的浏览器上工作的优势。

于 2013-07-11T20:05:12.603 回答
1

您可以让您的构造函数实现EventListener接口,如下所示:

function myClass(newName) {
    this.name = newName;
    this.m_fileReader = new FileReader();
    this.m_fileReader.addEventListener('loadend', this, false);
}

myClass.prototype.handleEvent = function(event) {
    return this[event.type] && this[event.type](event)
}

myClass.prototype.loadend = function(event) {
    alert(this.name);
};

var instance = new myClass('timmy');
var instance2 = new myClass('joe');

我将 to 重命名finishedLoadingloadend,并将其放在.prototype构造函数的 the 上。然后我.handleEvent.prototype.

最后在构造函数中,我们根本不传递函数。相反,只需传递this,这是您的myClass实例。

我删除了你的param1,因为不清楚如何使用它。如果它需要从其他调用中接收一些值,那么您可以finishedLoading在 上创建一个单独的方法.prototype,并让该.loadend()方法调用它。

于 2013-07-11T20:12:04.440 回答
0

this是相对于上下文的。每次打开新块 {} 时,它都会更改为当前块上下文。this在调用回调函数之前保存到另一个变量。

于 2013-07-11T20:06:47.467 回答