2017-04-26 96 views
2

中的对象成员我在构造函数中设置了一个变量,我无法从其中一个方法访问它,因为“this”引用了该函数(它不应该是这种情况) 。 下面是它看起来likecode:Nodejs无法访问方法

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); 
+1

你如何实例化类并调用方法?适用于我。 –

+6

'instance.test.bind(instance)' – robertklep

+0

@BenFortune编辑了这个问题 – aslad

回答

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没有这样的方法。

+0

感谢您的详细解释:) – robertklep