我在构造函数中设置了一个变量,我无法从其中一个方法访问它,因为“this”指的是函数(不应该是这种情况)。 这就是它看起来像:
class myMiddleware {
constructor(variable) {
this.variable = variable;
}
middleware(packet, next) {
console.log(this.variable)
}
}
我正在使用VS 2017以防万一。
编辑:我正在使用它作为socket.io套接字中间件。 这就是我这样做的方式: const myInstance = new myMiddleware(myVariable);
socket.use(myInstance.middleware);
答案 0 :(得分:3)
在评论中解释 robertklep 发布的解决方案:
instance.test.bind(instance)
通常在调用这样的方法时:
x.method();
x
(无论它是什么)在调用函数this
时绑定到x.method
。
如果您有一个y
对象并执行了此操作:
y.method = x.method;
然后当你打电话:
y.method();
y
将作为this
而不是x
传递。
这也意味着当你这样做:
method = x.method;
并尝试致电:
method();
原始x
不会被绑定为this
- 这是您的问题。您将该方法作为函数参数传递,从而丢失了流程中的原始实例对象。您传递方法的功能无法知道您希望将哪个对象绑定为this
。
但是所有JavaScript函数都有一个名为.bind()
的方法,该方法返回一个函数,该函数使用绑定为this
的正确对象调用您的方法。
所以这个:
let f = x.method.bind(x);
使f()
函数或多或少等同于:
function f(...args) {
return x.method(...args);
}
或:
let f = (...a) => x.method(...a);
如果您愿意,可以绑定其他对象:
let f = x.method.bind(y);
即使x
没有这样的方法,也可以在.method()
对象上调用y
' y
。