2017-04-26 118 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