gpt4 book ai didi

javascript - 我是否必须使用 "this."才能在 NodeJs 中使用 "object"属性?

转载 作者:行者123 更新时间:2023-11-30 11:53:50 25 4
gpt4 key购买 nike

我正在从 Java 切换到 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. 呢?这是正确的做法吗?

最佳答案

有时在 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'
})
};

其他人更喜欢使用 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));
};

关于javascript - 我是否必须使用 "this."才能在 NodeJs 中使用 "object"属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38655539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com