我必须使用"这个。"使用"对象" NodeJs中的属性?

时间:2016-07-29 09:42:42

标签: javascript node.js

我正在从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.?这是正确的方法吗?

2 个答案:

答案 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);