nodejs - 哪个"这个"这是?

时间:2015-07-02 08:35:47

标签: javascript node.js

所以这是一个尴尬的问题,但我学习NodeJS,我有一个问题。在Java中,当我从一个对象调用一个方法时,this实例保持不变(如本例所示)。

private Test inst;
public Test() {
    inst = this;
    this.myFunction();
}

private void myFunction() {
    System.out.println(inst == this);
}

这返回true(理论上,这个代码是我的头脑)。但是,在NodeJS中,当我尝试做类似的事情时,它失败了。

var MyObject = function () {
    this.other = new OtherObject();
    this.other.on("error", this.onError);
    console.log(this); //This returns the MyObject object
}

MyObject.prototype.onError = function (e) {
    console.log(this); //This returns the OtherObject object, where I thought it would return the MyObject object.
}

我的问题是为什么会这样,如果我这样做不正确,我怎样才能从onError方法正确引用MyObject实例中的其他变量?

2 个答案:

答案 0 :(得分:6)

在JavaScript中,“方法”只是对象的一部分。

如果你这样做

var obj = new MyObject();
obj.onError();

onError中的this将是obj对象(因为它是从中调用的对象)

相反,在你的情况下,你将this.onError传递给EventEmitter,它将使用EventEmitter(OtherObject)调用该函数。

要避免该问题,请使用无效功能。

var MyObject = function () {
    var self = this;
    this.other = new OtherObject();
    this.other.on("error", function (e) { self.onError(e); });
}

通过这种方式,您可以将其绑定到您期望的对象

答案 1 :(得分:0)

有更简单的方法 - 你可以使用绑定功能。

var EventEmitter = require('events').EventEmitter;

var MyObject = function () {
    this.other = new EventEmitter();
    this.other.on("error", this.onError.bind(this));
    console.log(1, this instanceof MyObject); // 1, true
};

MyObject.prototype.onError = function (e) {
    console.log(2, this instanceof MyObject); // 2, true
};

MyObject.prototype.callError = function (e) {
    console.log(3, this instanceof MyObject); // 3, true
    this.other.emit('error', e);
};

var mo = new MyObject();

mo.callError(new Error(1));

Demo