我正在从Java切换到NodeJ,所以有些事情对我来说仍然很模糊。
我正在尝试使用脚本,就像使用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.
?这是正确的方法吗?
答案 0 :(得分:2)
有时候在Java和JavaScript之间映射概念有点棘手。
简短的回答是,是的,如果您要尝试在JavaScript中创建类似于Java中的类实例的东西,那么您需要调用'这个'每一次。
原因是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'
})
};
其他人更喜欢使用Function#bind:
更明确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));
};
答案 1 :(得分:1)
为了避免使用 this ,您的模块可以是一个返回对象的函数:
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;
然后在没有新:
的情况下调用此函数var sftpHandler = SftpHandler(credentials.sftpHost, credentials.sftpUsername, credentials.sftpPassword);
sftpHandler.downloadFile(credentials.sftpPathToImportFiles+configFile.importFileName, callback);