所以这是一个尴尬的问题,但我学习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实例中的其他变量?
答案 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));