2016-07-29 62 views
1

我正在從Java切換到NodeJs,所以有些東西對我來說依然模糊不清。我必須使用「這個」。在NodeJs中使用「對象」屬性?

我正在嘗試使用腳本,就像我會用Java中的類一樣。我已經認識到這來做到這一點:

var client = require('scp2'); 
var host, username, password; 

var SftpHandler = function (host, username, password) { 
    this.host = host; 
    this.username = username; 
    this.password = password; 
}; 



SftpHandler.prototype.downloadFile = function (path, callback) { 
    console.log(this.host,username,password,path); 
}; 

module.exports = SftpHandler; 

問題是,當我把它從另一個這樣的腳本:

var sftpHandler = new SftpHandler(credentials.sftpHost, credentials.sftpUsername, credentials.sftpPassword); 
sftpHandler.downloadFile(credentials.sftpPathToImportFiles+configFile.importFileName, callback); 

我在控制檯日誌中有162.*.*.* undefined undefined undefined ...

我意識到這是由於我缺乏this.在我指的對象屬性。但爲什麼需要this.?這是做到這一點的正確方法嗎?

回答

2

有時,在Java和JavaScript之間映射概念有點棘手。

簡短的回答是,如果您要嘗試在JavaScript中使用Java中的類實例,那麼您需要每次調用「this」。

原因是JS中的this實際上是一個特殊的局部作用域變量,它指向調用作用域。它並不總是實際的類實例,不管你信不信,所以你需要更深入地閱讀它。

許多人選擇不嘗試,因爲有很多地方遵循Java成語會讓你陷入困境,或者讓事情變得更加困難/複雜/難以維護。

但在任何情況下,如何this可以改變一個例子,如果需要的話你downloadFile方法,以提供一個嵌套函數,例如你想處理一個回調函數的匿名函數:

SftpHandler.prototype.downloadFile = function (path, callback) { 
    console.log(this.host); // this here refers to your object instance 
    fileManager.getFile(path, function(e, file){ 
     console.log(this.host); // 'this' here refers to the anonymous function, not your object 
    }) 
}; 

希望這有助於。

**編輯如何去this回調**

有一對夫婦的方式來保持基準內。這是很常見的,只是在範圍上另一個變量設置爲原始this,就像這樣:

SftpHandler.prototype.downloadFile = function (path, callback) { 
    console.log(this.host); // this here refers to your object instance 
    var self = this; 

    fileManager.getFile(path, function(e, file){ 
     console.log(this.host); // 'this' here refers to the anonymous function, not your object 
     console.log(self.host); // 'self' there refers to the enclosing method's 'this' 
    }) 
}; 

其他人則傾向於與使用功能#結合的更加明確:

SftpHandler.prototype.downloadFile = function (path, callback) { 
    console.log(this.host); // this here refers to your object instance 
    fileManager.getFile(path, function(e, file){ 
     console.log(this.host); // 'this' here refers to the your object thanks to bind() 
    }.bind(this)); 
}; 
+0

我看@保羅謝謝你。正如在你的例子中寫的,嵌套函數中的'this'引用了它自己的參數。那麼你通常如何從該函數中訪問實例/對象屬性? +1 btw –

+2

@OndrejTokar - http:// stackoverflow。com/a/20279485/19068 – Quentin

+0

我就是這樣。但我認爲這是一個骯髒的解決方案。感謝您的參考。 –

1

要避免使用你的模塊可以是返回一個對象的函數:

var client = require('scp2'); 

var SftpHandler = function (host, username, password) { 

    return { 
    downloadFile: downloadFile 
    }; 

    function downloadFile (path, callback) { 
    console.log(host, username, password,path); 
    } 
}; 

module.exports = SftpHandler; 

然後你調用這個函數的Wi

var sftpHandler = SftpHandler(credentials.sftpHost, credentials.sftpUsername, credentials.sftpPassword); 
sftpHandler.downloadFile(credentials.sftpPathToImportFiles+configFile.importFileName, callback); 
相關問題